如何使此队列并行?

时间:2019-06-03 10:05:37

标签: python asynchronous queue tornado

我从这里有一个队列示例(Python + Tornado框架):https://www.tornadoweb.org/en/stable/queues.html

现在是顺序队列。如何使其平行?

由于我现在还不完全了解tornado.queues,因此我不清楚应如何更改代码以实现并行队列。

from tornado import gen
from tornado.ioloop import IOLoop
from tornado.queues import Queue

q = Queue(maxsize=2)

async def consumer():
    async for item in q:
        try:
            print('Doing work on %s' % item)
            await gen.sleep(0.01)
        finally:
            q.task_done()

async def producer():
    for item in range(5):
        await q.put(item)
        print('Put %s' % item)

async def main():
    # Start consumer without waiting (since it never finishes).
    IOLoop.current().spawn_callback(consumer)
    await producer()     # Wait for producer to put all tasks.
    await q.join()       # Wait for consumer to finish all tasks.
    print('Done')

IOLoop.current().run_sync(main)

我希望所有工作同时开始,然后同时完成,而不是一个接一个地完成任务。

非常感谢!

1 个答案:

答案 0 :(得分:1)

您需要做的就是产生多个消费者任务:

for i in range(num_consumers):
    IOLoop.current().spawn_callback(consumer)

然后,每个使用者都可以从队列和await中并行读取内容。 (请注意,因为龙卷风是单线程的,所以任何不使用await的东西都会阻塞所有内容)