说起 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 编程:如何实现协程调度的精准控制相关推荐

  1. go 怎么等待所有的协程完成_Go语言入门必知教程-协程

    Golang中的并发性是指函数独立运行的能力.Goroutines就是能够并发运行的函数,也叫协程,它们是Golang提供作为并发处理操作的方法. 使用go语句创建协程goroutines 要将函数作 ...

  2. python并发之协程_python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  3. C++ 协程与网络编程

    协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行.  协 ...

  4. python多线程多进程多协程_python 多进程、多线程、协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  5. python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...

    一.上集回顾 在上一篇中我们主要研究了python的多线程困境,发现多核情况下由于GIL的存在,python的多线程程序无法发挥多线程该有的并行威力.在文章的结尾,我们提出如下需求: 既然python ...

  6. php7协程通信使用,PHP7下的协程实现

    原标题:PHP7下的协程实现 什么是协程 先搞清楚,什么是协程. 你可能已经听过『进程』和『线程』这两个概念. 进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程 ...

  7. python中协程与函数的区别_python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  8. python3 协程 写法_理解Python的协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  9. linux的进程/线程/协程系列1:进程到协程的演化

    linux的进程/线程/协程系列1:进程到协程的演化 前言 摘要: 1. 一些历史:批处理时代 2. 现代操作系统启动过程 3. 进程(process)的出现 4. 线程(thread)与线程池 5. ...

最新文章

  1. 基于短语的统计机器翻(PBMT) 开源工具 :Moses
  2. 2020-11-18(失败的一天)
  3. android gis 框架,三、ArcGis For Android:图层(Layers)
  4. unity3d 多人寻路堵塞堆叠问题
  5. dojo使用query dojo/query
  6. python中round函数参数_python中关于round函数的小坑
  7. java 绘制sin函数图像_MATLAB基础学习之三维曲线的绘制
  8. MySQL不能使用/tmp
  9. 日立hgp电梯mcub03主板原理图
  10. 恒生电子软件测试面试
  11. c语言逻辑运算符的运算符优先级,逻辑运算符及其优先级,C语言逻辑运算符及其优先级详解(示例代码)...
  12. 腾讯云服务器搭建鸿蒙Hi3861开发板开发环境
  13. 计算机启动进入不了桌面图标,电脑开机不显示桌面图标怎么办,开机桌面图标不显示解决办法...
  14. cartographer中分支定界法理解——为什么能保证上界
  15. 【web前端】JavaScript总结
  16. Java编程思想第五版(On Java8)(四)-运算符
  17. Linux文件与目录的默认权限与隐藏权限(chattr,lsattr)
  18. x265-1.8版本-x265.h代码注释
  19. Java进阶,Set集合,Map集合
  20. java完整的利用itext5制作pdf、二维码图片插入pdf,并解析pdf中的二维码信息

热门文章

  1. python字典的常见操作_Python 字典(Dictionary) 基本操作
  2. jupyter 数据分析可视化案例_Python数据分析及可视化实例之Anaconda、Jupyter简介
  3. 台式电脑怎么连接手机热点_电脑搜不到手机热点 为什么搜不到手机热点
  4. 【洛谷 1969】积木大赛
  5. DE1-LINUX运行
  6. 约瑟夫环问题之猴子选大王
  7. 打印数组所有排列 python
  8. CONTEST199 [有奖]洛谷8月月赛题解
  9. oracle中简单查询语句的格式及执行顺序分析
  10. 网络安全-windows批处理