我从这里有一个队列示例(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)
我希望所有工作同时开始,然后同时完成,而不是一个接一个地完成任务。
非常感谢!
答案 0 :(得分:1)
您需要做的就是产生多个消费者任务:
for i in range(num_consumers):
IOLoop.current().spawn_callback(consumer)
然后,每个使用者都可以从队列和await
中并行读取内容。 (请注意,因为龙卷风是单线程的,所以任何不使用await
的东西都会阻塞所有内容)