美文网首页
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语言调度器

    协程的定义 轻量级的线程 非抢占式多任务处理,由协程主动交出控制权 编辑器/虚拟机/解释器层面的多任务 多个协程可...

  • 高伸缩性Go调度器设计(译)

    阅读该文档前假设你已经对go语言及其当前调度实现的有所了解 当前调度器所存在的问题 当前的调度器限制了go并发的伸...

  • go 调度器实现

    GO 语言的调度器 目录 GMP 模型简介 调度器实现机制 GMP 模型简介 先来一张经典的GMP 关系图 G 是...

  • Golang后端面试汇总-001

    基础面试 go的调度 为什么在内核的线程调度器之外Go还需要一个自己的调度器? go struct能不能比较 go...

  • Go 语言调度(二): goroutine 调度器

    介绍 上一篇文章我对操作系统级别的调度进行了讲解,这对理解 Go 语言的调度器是很重要的。这篇文章,我将解释下 G...

  • Go 的并发性与调度器

    本篇文章是我对 Go 语言并发性的理解总结,适合初步了解并发,对 Go 语言的并发编程与调度器原理有兴趣的读者。 ...

  • golang调度器学习

    概要 本文从几个角度入手,描述和学习调度器原理 讲解调度器的基本概念 go语言的作者实现的C的协程库 libtas...

  • Go调度器系列(2)宏观看调度器

    上一篇文章《Go语言高阶:调度器系列(1)起源》,学goroutine调度器之前的一些背景知识,这篇文章则是为了对...

  • [译] Go语言调度器 by povilas

    欢迎访问我的个人网站获取更佳排版体验: https://pengrl.com/p/22729/ 基础 Go语言的运...

  • Go并发调度

    本文是《循序渐进Go语言》的第六篇-Go并发调度。本文是学习《Go语言学习笔记》的并发调度一章,然后结合阅读源码的...

网友评论

      本文标题:Go语言调度器

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