python - 如何使这个队列并行?

标签 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)

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

非常感谢!

最佳答案

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

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

然后每个消费者将能够从队列中读取并并行等待事物。 (请注意,由于 Tornado 是单线程的,因此任何不使用 await 的内容都会阻塞所有内容)

关于python - 如何使这个队列并行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56425093/

相关文章:

python - Pandas 将 NaN 从零插值到下一个有效值

python - os.rename() 适用于 Mac 中打开的文件。还有什么选择呢?

scala - 使用 Akka Streams、Scala 异步读取多个文件

c++ - std::async 指定线程的模拟

python - Sieve of Eratosthenes set-实现困惑

python - 如何将查询集传递给 Django 中的上下文类?

javascript - Node.JS:如何将变量传递给异步回调?

在 c 中创建一个 FIFO 队列

javascript - 高级搜索/队列数组集合问题

c - C 中带头节点的链表