【发布时间】:2019-06-03 10:05:37
【问题描述】:
我有一个来自这里的队列示例(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)
我希望所有工作同时开始,然后同时完成,而不是一个接一个地完成。
非常感谢!
【问题讨论】:
-
这是预期的行为,因为 Tornado 是单线程的。因此,IOLoop 一次只能运行一件事。有关更多信息,请参阅differences between concurrency vs parallelism。
标签: python asynchronous queue tornado