美文网首页
Go语言调度器

Go语言调度器

作者: __apple | 来源:发表于2018-06-04 20:40 被阅读0次
    协程的定义
    • 轻量级的线程
    • 非抢占式多任务处理,由协程主动交出控制权
    • 编辑器/虚拟机/解释器层面的多任务
    • 多个协程可能在多个或者一个线程上运行

    我们先来一张图,简单的看一下什么是普通函数什么是协程


    coroutine.png

    我们发现main与dowork之间是一个双向的通道
    我们在深入理解Go的协程之前先来看看其他的语言对于协程的支持。。。。

    • C++: Boost.Coroutine
    • Java: 不支持
    • Python: 使用yield关键字实现协程 Python3.5加入async def 对协程原生支持

    那么Go语言是怎么实现的呢?


    routine.png

    我们发现有时候一个线程里面可以放1个goroutine有时候好多个,那么这个由谁来控制的呢?这个不用我们管这个是调度器来处理的。

    goroutine的定义

    • 任何函数只需要加上go就能送给调度器运行
    • 不需要在定义时区分是否是异步函数(这个只要是针对python而言的 )
    • 调度器在合适的点进行切换(这个也是区别其他编程语言协程的方面之一)
    • 使用-race来检测数据访问冲突
    那么goroutine由那么可能切换的点呢?
    • I/O, select
    • channel
    • 等待锁
    • 函数调用(有时)
    • runtime.Gosched()
    • 只是参考,不能保证切换,不能保证在其他的地方不切换。
      现在我们来看看如果我们起1000个goroutine,它会起多少个线程


      main.png

      我们给它一分钟的时间让他们拼命的打,我们看一下cpu的情况


      cpu.png
      我们可以看到,线程数最多是4这是因为我就是4核的机子,我们虽然开了1000个goroutine但是它是映射到4个物理线程上执行,我们后面有个调度器进行调度。
      我们下节就开始讲双向的通道channel。。。。。。敬请期待吧!!!!

    相关文章

      网友评论

          本文标题:Go语言调度器

          本文链接:https://www.haomeiwen.com/subject/khxssftx.html