好气啊,写(chao)了一大堆,结果脚不小心碰到插座了,全没了!全没了!整整一天的心血(虽然其中很大一部分时间在开小差),本来从python协程的历史,详细介绍了协程一步一步的发展,没动力再重新写一遍了。。。就把协程到底怎么用再写一下。。(python版本3.7++)
python协程实现的过程就是:将所有协程注册进一个事件循环,这个事件循环一直在不停的给里面的协程排序,排序的 key 是时间戳。主循环一直扫这个队列, 当前时间戳>=排序 key 就调用这个 key 对应的协程。所有的协程都是在这个队列里排序等待执行。当一个运行中的协程遇到await
命令,就会暂停当前任务的执行并保存当前状态,把执行权交给其他任务。等到主循环再把执行权交回当前函数时,从保存的状态继续往下执行。
下面来看一下具体怎么使用,来体会一下上面这句话。
import asyncio
import random
import datetime
async def wait_and_echo(content):
wait = random.randint(0, 10)
print(f'print {content} after {wait} seconds')
await asyncio.sleep(wait) # 3、保存当前状态,让出执行权
print(f'{content} printed at {datetime.datetime.utcnow().strftime("%H:%M:%S ")}')
async def main():
await asyncio.gather(*[wait_and_echo(x) for x in range(3)]) # 2、将协程注册进事件循环
asyncio.run(main()) # 1、启动协程的事件循环
# 运行输出:
print 0 after 2 seconds
print 1 after 3 seconds
print 2 after 5 seconds
0 printed at 07:38:58
1 printed at 07:38:59
2 printed at 07:39:01
参考:
1、https://www.v2ex.com/t/517550
2、https://cloud.tencent.com/developer/article/1194415
3、https://www.ruanyifeng.com/blog/2019/11/python-asyncio.html
4、https://www.jianshu.com/p/b5e347b3a17c
5、https://www.liujiangblog.com/course/python/83
6、https://www.liaoxuefeng.com/wiki/1016959663602400/1048430311230688
7、https://blog.csdn.net/soonfly/article/details/78361819