python asyncio模块源码一点分析

python asyncio 模块浅析

前言

本文分析的是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),进入事件循环,直至结束任务

  1. 创建事件循环
# 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的调度安排

  1. 创建Task对象
class Task(futures._PyFuture):
	def __init__(self, coro, *, loop=None, name=None, context=None,
                 eager_start=False)
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值