go 怎么等待所有的协程完成_Go 编程:如何实现协程调度的精准控制
说起 Go 协程的调度,如果你了解 Go 调度器以及其实现的 G/P/M 模型,当然有助于应用的开发。但是在应用层面上,这些底层的调度原理并不会帮你太多,实现 Go 协程的精准调度得完全靠自己。
问题
例如,实际应用中我们要解决的问题是这样的。那么,我们该如何实现调度的精准控制呢?
实现
简单的协程控制,很多人都会使用 sync.WaitGroup 进行多协程的控制。但是 sync.WaitGroup 面对图示的调度控制就显得无能为力了。
上图的协程调度看似复杂,如果仔细分析一下,就会发现单个协程的启动需要等待依赖协程完成才能开始。所以,问题的关键是实现协程间的前置依赖。
那么,这样一个前置依赖该如何实现呢?这里直接贴出我的方案,你也可以想想你要如何实现。
package eventimport ( "sync" "sync/atomic")type Event struct { fired int32 c chan struct{} once sync.Once}func New() *Event { return &Event{c: make(chan struct{})}}func (ev *Event) Fire() int32 { atomic.AddInt32(&ev.fired, 1) ev.once.Do(func() { close(ev.c) }) return ev.fired}func (ev *Event) Done() 0}
这样一个简单的事件触发器就可以来模拟协程前置依赖。例如,图示中的B1的启动依赖于A1与C1,那么我们的实现代码就可以这样实现:
package mainimport ( "github.com/x-mod/event" //Event 开源项目在这里)func main(){ //前置依赖 a1 := event.New() b1 := event.New() c1 := event.New() //A1 协程 go func(){ defer a1.Fire() // A1 LOGIC ... } //B1 协程 go func(){ defer b1.Fire() // 等待前置依赖完成
项目地址:https://github.com/x-mod/event
go 怎么等待所有的协程完成_Go 编程:如何实现协程调度的精准控制相关推荐
- go 怎么等待所有的协程完成_Go语言入门必知教程-协程
Golang中的并发性是指函数独立运行的能力.Goroutines就是能够并发运行的函数,也叫协程,它们是Golang提供作为并发处理操作的方法. 使用go语句创建协程goroutines 要将函数作 ...
- python并发之协程_python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- C++ 协程与网络编程
协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行. 协 ...
- python多线程多进程多协程_python 多进程、多线程、协程
1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...
- python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...
一.上集回顾 在上一篇中我们主要研究了python的多线程困境,发现多核情况下由于GIL的存在,python的多线程程序无法发挥多线程该有的并行威力.在文章的结尾,我们提出如下需求: 既然python ...
- php7协程通信使用,PHP7下的协程实现
原标题:PHP7下的协程实现 什么是协程 先搞清楚,什么是协程. 你可能已经听过『进程』和『线程』这两个概念. 进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程 ...
- python中协程与函数的区别_python 协程与go协程的区别
进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...
- python3 协程 写法_理解Python的协程(Coroutine)
由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...
- linux的进程/线程/协程系列1:进程到协程的演化
linux的进程/线程/协程系列1:进程到协程的演化 前言 摘要: 1. 一些历史:批处理时代 2. 现代操作系统启动过程 3. 进程(process)的出现 4. 线程(thread)与线程池 5. ...
最新文章
- 基于短语的统计机器翻(PBMT) 开源工具 :Moses
- 2020-11-18(失败的一天)
- android gis 框架,三、ArcGis For Android:图层(Layers)
- unity3d 多人寻路堵塞堆叠问题
- dojo使用query dojo/query
- python中round函数参数_python中关于round函数的小坑
- java 绘制sin函数图像_MATLAB基础学习之三维曲线的绘制
- MySQL不能使用/tmp
- 日立hgp电梯mcub03主板原理图
- 恒生电子软件测试面试
- c语言逻辑运算符的运算符优先级,逻辑运算符及其优先级,C语言逻辑运算符及其优先级详解(示例代码)...
- 腾讯云服务器搭建鸿蒙Hi3861开发板开发环境
- 计算机启动进入不了桌面图标,电脑开机不显示桌面图标怎么办,开机桌面图标不显示解决办法...
- cartographer中分支定界法理解——为什么能保证上界
- 【web前端】JavaScript总结
- Java编程思想第五版(On Java8)(四)-运算符
- Linux文件与目录的默认权限与隐藏权限(chattr,lsattr)
- x265-1.8版本-x265.h代码注释
- Java进阶,Set集合,Map集合
- java完整的利用itext5制作pdf、二维码图片插入pdf,并解析pdf中的二维码信息