Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用asyncio.queue()时,当使用者在队列中没有任务时会发生什么情况_Python 3.x_Python Asyncio - Fatal编程技术网

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我不确定您所说的“将调度任务添加到队列”是什么意思。队列是不同任务/协同程序之间的通信通道,用于生产者-消费者工作流,如您所问的工作流。虽然队列可以传输任何对象,但将任务添加到队列中是没有意义的(没有上下文)。任务由事件循环自动执行和(重新)调度,与是否已添加到特定的用户级队列无关。感谢您的回答。我很感激。