运行 协程中的阻塞任务

Run blocking task in coroutine

我有一台服务器从 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())

要与 SQS 集成,最好使用 aiobotocore 库 - asyncio 兼容的 AWS 驱动程序。以下是 SQS 用法示例:http://aiobotocore.readthedocs.io/en/latest/examples.html#sqs

一般来说,如果您必须使用具有阻塞函数调用的外部库 - 使用 asyncio executors API,它将阻塞调用委托给线程池。