10.2 go语言的调度器

一、子程序

  1. 子程序是协程的一个特例

二、其他语言中的协程

  1. C++:Boost.Coroutine

  2. Java:不支持,第三方除外

  3. python:

    1. 使用yield关键字实现协程

    2. Python 3.5加入了async def对协程原生支持

三、协程

  1. 协程的定义:

    1. 任何函数只需加上go就能送给调度器运行

    2. 不需要定义时区分是否是异步函数(对比python)

    3. 调度器在合适的点进行切换

    4. 使用-race来检测数据访问冲突

  2. 可能的切换点

    1. I/O, select

    2. channel

    3. 等待锁

    4. 函数调用(有事)

    5. runtime.Gosched() 手动交出

    6. 只是参考,不能保证切换,不能保证在其他地方不切换

  3. 注意:不管你开房多少个线程,调度器会映射到你的物理机器上,使用最大核数进行调度

Last updated

Was this helpful?