Bri*_*ian 5 python threadpool python-asyncio
我一直在使用 asyncio 进行并发,但是遇到了问题。我需要使用 asyncio 安排一个任务,但它是阻塞的,所以我想使用并发.futures 中的线程池在执行器中执行它。
我见过这样的例子,安排任务:
now = loop.time()
loop.call_at(now + 60, callback, arg, loop)
Run Code Online (Sandbox Code Playgroud)
像这样在执行器中运行任务:
blocking_tasks = [
loop.run_in_executor(executor, blocks)
for i in range(6)
]
completed, pending = await asyncio.wait(blocking_tasks)
Run Code Online (Sandbox Code Playgroud)
但是如何安排阻塞任务在执行器中运行呢?
run_in_executor返回一个 future,所以你不能将它与 一起使用call_at,这需要一个普通的函数。但是,您可以使用以下方法轻松推迟执行asyncio.sleep():
async def my_task():
await asyncio.sleep(60)
result = await loop.run_in_executor(None, fn)
...
taskobj = loop.create_task(my_task())
Run Code Online (Sandbox Code Playgroud)
这样做的好处是create_task可以在睡眠期间取消所创建的任务。此外,您还可以使用、调用或来返回有用的值my_task()并获取它。await taskobjtaskobj.result()loop.run_until_complete(taskobj)