Как сделать эту очередь параллельной? - PullRequest
1 голос
/ 03 июня 2019

У меня есть пример очереди отсюда (среда 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 Ответ

1 голос
/ 10 июня 2019

Все, что вам нужно сделать, это запустить несколько пользовательских задач:

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

Тогда каждый потребитель сможет читать из очереди и await вещи параллельно.(Обратите внимание, что поскольку Tornado является однопоточным, все, что не использует await, заблокирует все)

...