Запустить блокирующее задание в сопрограмме - PullRequest
0 голосов
/ 16 мая 2018

У меня есть сервер, который читает сообщения из очереди SQS с длинным опросом, который блокирует выполнение сопрограммы. Есть ли способ оставить процессоры работающими, пока планировщик заблокирован в ожидании новых сообщений?

import asyncio
import time

NUM_EXEC = 10

async def processor(i):
    print (f"Starting {i}")
    for n in range(10):
        print(f"Processor {i} cycle {n}")
        await asyncio.sleep(1)

async def scheduler():
    for i in range(NUM_EXEC):
        #Blocking SQS long poll
        time.sleep(5)
        #Run processor
        await asyncio.ensure_future(processor(i))

loop = asyncio.get_event_loop()
loop.run_until_complete(scheduler())

1 Ответ

0 голосов
/ 16 мая 2018

Для интеграции с SQS предпочтительно использовать библиотеку aiobotocore - asyncio-совместимый драйвер AWS. Вот пример использования SQS: http://aiobotocore.readthedocs.io/en/latest/examples.html#sqs

В общем, если вам нужно использовать внешнюю библиотеку с блокирующими вызовами функций - используйте asyncio executors API , который делегирует блокирующие вызовы пулу потоков.

...