【GO】golang 协程初探 ,基于生产者/消费者


package main

import (
    "fmt"
    "time"
)

func main() {
    // 管道 固定5个int
    ch := make(chan int, 5)
    // 生成者 协程
    // 管道只能存5个int, 但是要生产15个int, 这就要等消费者先消费完(未消费前生产会阻塞), 然后生产
    go func(ch chan int) {
        for i := 0; i < 15; i++ {
            ch <- i
            fmt.Println("put data: ", i)
        }
    }(ch)

    // 主线程充当消费者, 一直会等待把生产数据全部读完
    for {
        data := <-ch
        fmt.Println("read data: ", data)
        time.Sleep(time.Second)
    }

}

原文地址:https://www.cnblogs.com/jzsg/p/11023651.html

时间: 2024-08-29 02:51:54

【GO】golang 协程初探 ,基于生产者/消费者的相关文章

协程初探

文章出处:http://blog.csdn.net/lanphaday/archive/2010/03/19/5397038.aspx 协程,又称微线程和纤程等,据说源于 Simula 和 Modula-2 语言(我没有深究,有错请指正),现代编程语言基本上都有支持,比方 Lua.ruby 和最新的 Google Go,当然也还有近期非常让我惊艳的 falcon.协程是用户空间线程,操作系统对其存在一无所知,所以须要用户自己去做调度,用来运行协作式多任务非常合适.其有用协程来做的东西,用线程或进

golang协程同步的几种方法

目录 golang协程同步的几种方法 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup golang协程同步的几种方法 本文简要介绍下go中协程的几种同步方法. 协程概念简要理解 协程类似线程,是一种更为轻量级的调度单位,但协程还是不同于线程的,线程是系统级实现的,常见的调度方法是时间片轮转法,如每隔10ms切换一个线程执行. 协程则是应用软件级实现,它和线程的原理差不多,当一个协程调度到另一个协程时,将上一个协程的上下文信息压入堆栈,来回切换

Python与Golang协程异同

背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 进程和线程的关系: 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. CPU的最小调度单元是线程不是进程,所以单进程多线程也可以利用多核CPU. 协程的定义: 协

面试必问:Golang高阶-Golang协程实现原理

引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发) 进程和线程的区别 进程是计算机资源分配的最小单位,进程是对处理器资源(CPU),虚拟内存(1)的抽象, 虚拟内存是对主存资源(Memory)和文件(2)的抽象,文件是对I/O设备的抽象. 虚拟内存是操作系统初始化后内部维护的一个程序加载空间,对于32位操作系统来说,也就是寄存器有32位的比特长度,虚拟内存中每个字节都有一个内

10 线程 协程 socketserver 基于udp的socketserver

线程进程 操作系统的作用: 1.把硬件丑陋复杂的接口隐藏起来,为应用程序提供良好接口 2.管理,调用进程,并且把进程之间对硬件的竞争变得有序化 多道技术: 1.产生背景:为了实现单cpu下的并发效果 2.分为两部分: 1:空间上的复用(必须实现硬件层面的隔离) 2:时间上的复用(复用cpu的时间片) 什么切换? 1:正在执行的任务遇到的阻塞 2:正在执行的任务运行时间过长 进程:正在运行的一个过程/一个任务,由操作系统负责调用,然后由cpu负责执行程序:就是程序员写的代码并发:伪并行,单核+多道

关于协程:nodejs和golang协程的不同

nodejs和golang都是支持协程的,从表现上来看,nodejs对于协程的支持在于async/await,golang对协程的支持在于goroutine.关于协程的话题,简单来说,可以看作是非抢占式的轻量级线程. 协程本身 一句话概括,上面提到了 "可以看作是非抢占式的轻量级线程". 在多线程中,把一段代码放在一个线程中执行,cpu会自动将代码分成碎片,并在一定时间切换cpu控制权,线程通过锁机制确保自己使用的资源在cpu执行别的线程的代码时被修改(占用的内存堆栈.硬盘数据资源等)

golang协程——通道channel阻塞

新的一年开始了,不管今天以前发生了什么,向前看,就够了. 说到channel,就一定要说一说线程了.任何实际项目,无论大小,并发是必然存在的.并发的存在,就涉及到线程通信.在当下的开发语言中,线程通讯主要有两种,共享内存与消息传递.共享内存一定都很熟悉,通过共同操作同一对象,实现线程间通讯.消息传递即通过类似聊天的方式.golang对并发的处理采用了协程的技术.golang的goroutine就是协程的实现.协程的概念很早就有,简单的理解为轻量级线程,goroutine就是为了解决并发任务间的通

测试一下golang协程资源占有率

GO版本:go version go1.4.2 linux/amd64 测试环境: [[email protected] mpro]# more /proc/cpuinfo | grep "model name" model name      : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name      : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name      : Inte

Lua 协程 coroutine

协程是协同程序的简称,顾名思义,就是协同工作的程序.协程拥有自己独立的桟.局部变量和PC计数器,同时又与其他协同程序共享全局变量和其他大部分东西: 协程与线程的主要区别在于,一个多线程程序可以同时运行几个线程(并发执行.抢占),而协同程序却需要彼此协作地运行,即一个多协程程序在任意时刻只能运行一个协程,并且正在执行的协程只会在其显式地要求挂起(suspend)时,它的执行才会暂停(无抢占.无并发). Lua中所有与协程相关的函数都在coroutine(一个table)中: 函数create用于创