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
循环的每次迭代时将控制权让给事件循环。请注意,这将导致事件循环通过连续旋转循环来消耗整个核心。
这篇关于事件循环中的共享队列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:事件循环中的共享队列


猜你喜欢
- pytorch 中的自适应池是如何工作的? 2022-07-12
- 分析异常:路径不存在:dbfs:/databricks/python/lib/python3.7/site-packages/sampleFolder/data; 2022-01-01
- 沿轴计算直方图 2022-01-01
- 如何将一个类的函数分成多个文件? 2022-01-01
- python-m http.server 443--使用SSL? 2022-01-01
- python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令 2022-01-01
- 使用Heroku上托管的Selenium登录Instagram时,找不到元素';用户名'; 2022-01-01
- 如何在 Python 的元组列表中对每个元组中的第一个值求和? 2022-01-01
- padding='same' 转换为 PyTorch padding=# 2022-01-01
- 如何在 python3 中将 OrderedDict 转换为常规字典 2022-01-01