协程就是单线程多任务, 在一个任务等待的时候干点别的其他的任务. 所以包含等待的函数都要用协程的版本: 在需要时交出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)
  • 可以用inspectgetgeneratorstate 查看协程(coroutine)的状态

javascript的用法

  • callback
  • promise

java21的虚拟线程

[1] https://www.bilibili.com/video/BV18i4y1u7Cr/