如何使用 asyncio 安排任务在执行器中运行?

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)

但是如何安排阻塞任务在执行器中运行呢?

use*_*342 5

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)