【问题标题】:How to make this queue parallel?如何使这个队列并行?
【发布时间】: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)

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

非常感谢!

【问题讨论】:

标签: python asynchronous queue tornado


【解决方案1】:

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

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

然后每个消费者将能够并行读取队列和await 的东西。 (注意,由于 Tornado 是单线程的,任何不使用await 的东西都会阻塞一切)

【讨论】:

  • 他不应该使用add_callback 而不是spawn_callback,因为前者只是一个别名?来自您自己的文档tornadoweb.org/en/stable/… ;)(ps:感谢您为 Tornado 所做的一切,我喜欢它)
  • add_callbackspawn_callback 现在是等价的,但在旧版本的龙卷风中它们是不同的。我在这里使用了spawn_callback,因为问题确实如此。
猜你喜欢
  • 2010-10-26
  • 2012-03-17
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多