前言
本文分析的是python 3.12版本中 Lib文件夹下的asyncio package,而python实际运行时import asyncio的包是 c 语言写的 _asynciomodule.c
样例代码
import asyncio
async def wait(sec: int):
print(f'going to waiting for {
sec} secs ...')
await asyncio.sleep(sec)
print(f'waited for {
sec} secs.')
async def main():
asyncio.create_task(wait(2))
await asyncio.create_task(wait(3))
asyncio.run(main())
分析
在执行run这个方法时会创建一个event loop,然后根据main()创建一个Task,最后 self._loop.run_until_complete(task),进入事件循环,直至结束任务
- 创建
事件循环
# base_events.py
class BaseEventLoop(events.AbstractEventLoop):
def __init__(self):
...
self._ready = collections.deque()
self._scheduled = []
...
...
def run_forever(self):
...
while True:
self._run_once()
if self._stopping:
break
...
在事件循环在运行的时候,就会掉进这个while True 里面,直到标志位被满足退出循环,如果说这个大循环提供了一个不断执行的环境,_run_once()这个方法则负责具体 Task的调度安排
- 创建
Task对象
class Task(futures._PyFuture):
def __init__(self, coro, *, loop=None, name=None, context=None,
eager_start=False)


5314

被折叠的 条评论
为什么被折叠?



