Share queue in event loop(事件循环中的共享队列)
本文介绍了事件循环中的共享队列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
是否可以在一个事件循环中跨不同任务共享Asyncio.Queue?
用例:
两个任务在队列上发布数据,一个任务从队列中获取新项目。以异步方式执行所有任务。
main.py
import asyncio
import creator
async def pull_message(queue):
while True:
# Here I dont get messages, maybe the queue is always
# occupied by a other task?
msg = await queue.get()
print(msg)
if __name__ == "__main__"
loop = asyncio.get_event_loop()
queue = asyncio.Queue(loop=loop)
future = asyncio.ensure_future(pull_message(queue))
creators = list()
for i in range(2):
creators.append(loop.create_task(cr.populate_msg(queue)))
# add future to creators for easy handling
creators.append(future)
loop.run_until_complete(asyncio.gather(*creators))
creator.py
import asyncio
async def populate_msg(queue):
while True:
msg = "Foo"
await queue.put(msg)
推荐答案
您代码中的问题是populate_msg不会屈服于事件循环,因为队列是无界的。这有点违反直觉,因为协同例程明显包含await,但是await只有在协同例程否则会挡路的情况下才会暂停协同例程的执行。由于无界队列上的put()从不阻塞,因此populate_msg是事件循环唯一执行的操作。
populate_msg更改为实际执行其他操作(如等待网络事件),问题就会消失。出于测试目的,您可以在循环内添加await asyncio.sleep(0),这将强制协程在while循环的每次迭代时将控制权让给事件循环。请注意,这将导致事件循环通过连续旋转循环来消耗整个核心。
这篇关于事件循环中的共享队列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:事件循环中的共享队列
基础教程推荐
猜你喜欢
- 包装空间模型 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
- 修改列表中的数据帧不起作用 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
