协程Coroutine

诺之林 · · 704 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

目录

多任务

  • PHP/Nginx多进程

  • Java多线程

互动: 进程和线程的区别?

协程

  • 单线程

  • 多任务

互动: 单线程处理多任务类似?

优势

  • 单线程 减少多线程操作系统维护成本

  • 用户态 减少用户态和内核态切换成本

  • 协作式 减少操作系统时间片调度成本

语言

  • Python
def consumer():
    r = "[C] Consumer start"
    while True:
        i = yield r
        print("[C] Consumer is consuming %s" % i)
        r = "ok"


def producer(consumer):
    start = consumer.send(None)
    print(start)
    for i in range(1, 4):
        print("[P] Producer is producing %d" % i)
        r = consumer.send(i)
        print('[P] Consumer return: %s' % r)
    consumer.close()


if __name__ == "__main__":
    producer(consumer())
[C] Consumer start
[P] Producer is producing 1
[C] Consumer is consuming 1
[P] Consumer return: ok
[P] Producer is producing 2
[C] Consumer is consuming 2
[P] Consumer return: ok
[P] Producer is producing 3
[C] Consumer is consuming 3
[P] Consumer return: ok
  • JavaScript ES6
function timeout(ms) {
    return new Promise((resolve) => {
        setTimeout(resolve, ms)
    })
}

async function asyncPrint(value, ms) {
    await timeout(ms)
    console.log(value)
}

asyncPrint("print", 2000)
console.log("return")
return
print # 2秒后
  • Golang
# Todo

更多可以参考支持协程的编程语言

场景

  • IO密集型

互动: 为什么协程适用于IO密集型场景?

参考


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:诺之林

查看原文:协程Coroutine

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

704 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传