协程就是单线程多任务, 在一个任务等待的时候干点别的其他的任务. 所以包含等待的函数都要用协程的版本: 在需要时交出event loop的控制权.
python 协程的用法
在python里把一个协程函数也叫coroutine
- yield(生成器): 会把当前函数挂起, 保留当前执行状态, 交出event loop的控制权给调用方, 再次调用函数时从暂停处继续.
- 包含yield的函数会变成一个coroutine
next()会激活coroutine- 一个主要用法是用于创建超大的list, 不会直接创建好占用内存.
- 缺点是无法直接得到list的size
- yield from: 交出控制权
- 可以自动循环可迭代对象
- future
- asyncio
- async 函数不会马上执行其中代码, 而是返回coroutine
- await 相当于yield from: 捕获StopIteration异常, 把StopIteration的value属性的值变为yield from表达式的值
- 后面可以是task/coroutine/future
- task: 可以被执行的函数
- create_task 可以生成task
- await 也会
- asyncio.run() 的时候会执行task
- aiohttp
- 特点:
- 需要每个子任务结束主动告知(运行结束, return)
- 可以用
inspect的getgeneratorstate查看协程(coroutine)的状态
javascript的用法
- callback
- promise
java21的虚拟线程
[1] https://www.bilibili.com/video/BV18i4y1u7Cr/