python协程之动态添加任务的方法
作者:梦醒人醉 时间:2021-03-24 04:27:54
python协程只能运行在事件循环中,但是一旦事件循环运行,又会阻塞当前任务。所以只能在当前进程中再开一个线程,这个线程的主要任务是运行事件循环,就是event_loop,因为他是一个无限循环,会阻塞当前线程。
放一个自己写的demo,注释写的很详细。
另外还有一点需要注意,一个事件循环中不能运行另外一个事件循环。
运行结果:
import asyncio
from threading import Thread
async def production_task():
i = 0
while True:
# 将consumption这个协程每秒注册一个到运行在线程中的循环,thread_loop每秒会获得一个一直打印i的无限循环任务
asyncio.run_coroutine_threadsafe(consumption(i),
thread_loop) # 注意:run_coroutine_threadsafe 这个方法只能用在运行在线程中的循环事件使用
await asyncio.sleep(1) # 必须加await
i += 1
async def consumption(i):
while True:
print("我是第{}任务".format(i))
await asyncio.sleep(1)
def start_loop(loop):
# 运行事件循环, loop以参数的形式传递进来运行
asyncio.set_event_loop(loop)
loop.run_forever()
thread_loop = asyncio.new_event_loop() # 获取一个事件循环
run_loop_thread = Thread(target=start_loop, args=(thread_loop,)) # 将次事件循环运行在一个线程中,防止阻塞当前主线程
run_loop_thread.start() # 运行线程,同时协程事件循环也会运行
advocate_loop = asyncio.get_event_loop() # 将生产任务的协程注册到这个循环中
advocate_loop.run_until_complete(production_task()) # 运行次循环
来源:https://blog.csdn.net/qq_29349715/article/details/79730786
标签:python,协程,任务
0
投稿
猜你喜欢
sqlserver 导出插入脚本代码
2024-01-26 22:39:18
python去除拼音声调字母,替换为字母的方法
2022-02-13 10:43:55
python编辑用户登入界面的实现代码
2022-02-07 20:24:08
PHP简易延时队列的实现流程详解
2023-05-29 23:02:48
ASP中正则表达式的应用
2010-05-27 12:24:00
Pytorch 图像变换函数集合小结
2022-06-14 08:52:09
Python利用Matplotlib库实现绘制饼形图
2021-08-13 11:08:51
浅析SQL Server中包含事务的存储过程
2024-01-15 21:27:39
python中使用iterrows()对dataframe进行遍历的实例
2023-12-29 13:43:02
asp测字符串长度及截取定长字符串汉字的处理
2007-10-12 13:14:00
Mysql查询表中最小可用id值的方法
2024-01-27 02:31:29
红黑树的插入详解及Javascript实现方法示例
2024-04-19 11:03:13
python制作的天气预报小工具(gui界面)
2022-04-03 17:20:42
python加密打包程序详解
2021-03-02 02:02:46
JavaScript框架比较:选择器
2010-04-20 14:48:00
Python列表对象实现原理详解
2022-09-07 10:24:58
python sys.stdin和sys.stdout的用法说明
2022-04-05 07:35:29
python实现自动登录
2023-10-20 05:11:46
让你的空间支持域名绑定子目录的解决办法
2010-09-15 10:03:00
避免使用滤镜
2009-10-13 20:30:00