Python 3.x 使用asyncio.queue()时,当使用者在队列中没有任务时会发生什么情况
我有这个剧本Python 3.x 使用asyncio.queue()时,当使用者在队列中没有任务时会发生什么情况,python-3.x,python-asyncio,Python 3.x,Python Asyncio,我有这个剧本 import asyncio import random q = asyncio.Queue() async def producer(num): while True: await q.put(num + random.random()) await asyncio.sleep(random.random()) async def consumer(num): while True: value = awai
import asyncio
import random
q = asyncio.Queue()
async def producer(num):
while True:
await q.put(num + random.random())
await asyncio.sleep(random.random())
async def consumer(num):
while True:
value = await q.get()
print('Consumed', num, value)
loop = asyncio.get_event_loop()
for i in range(6):
loop.create_task(producer(i))
for i in range(3):
loop.create_task(consumer(i))
loop.run_forever()
使用asyncio.Queue()
我一直在运行我的脚本,随机生成任务并将它们添加到队列中。如果队列中没有要使用的任务,这是在毫无意义地使用cpu,还是无害且不会产生错误
如果队列中没有要使用的任务,这是否会产生错误
由于消费者调用以使用下一个排队项目,因此如果队列为空,它将只等待下一个项目到达。在等待过程中不会浪费CPU,也不会报告错误-消费者协同程序将暂停,直到生成一个项目,之后它将立即被唤醒。在等待期间,事件循环可以自由运行其他协同程序(如果有的话)。哇,这太有效了。我想知道制作人是否可以绑定到诸如rabbit mq、kafka或redis之类的消息传递软件。@Gandalf当然可以,我相信这是像和这样的库的使用案例之一。在您关于调度的回答中,我想知道我们是否可以将调度任务添加到队列中,以及使用者的异步特性是否会接受在准确的时间戳处理。@Gandalf我不确定您所说的“将调度任务添加到队列”是什么意思。队列是不同任务/协同程序之间的通信通道,用于生产者-消费者工作流,如您所问的工作流。虽然队列可以传输任何对象,但将任务添加到队列中是没有意义的(没有上下文)。任务由事件循环自动执行和(重新)调度,与是否已添加到特定的用户级队列无关。感谢您的回答。我很感激。