在协程中运行阻塞任务

时间:2018-05-16 11:34:49

标签: python multithreading asynchronous python-asyncio amazon-sqs

我有一个服务器,它使用长轮询从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 :(得分:4)

要与SQS集成,最好使用aiobotocore库 - 与asyncio兼容的AWS驱动程序。以下是SQS用法的示例:video

通常,如果必须使用带阻塞函数调用的外部库 - 请使用http://aiobotocore.readthedocs.io/en/latest/examples.html#sqs,它将阻塞调用委托给线程池。