当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python asyncio.to_thread用法及代码示例


用法:

coroutineasyncio.to_thread(func, /, *args, **kwargs)

在单独的线程中异步运行函数func

为此函数提供的任何 *args 和 **kwargs 都直接传递给 func 。此外,当前的contextvars.Context 被传播,允许在单独的线程中访问来自事件循环线程的上下文变量。

返回一个协程,可以等待得到 func 的最终结果。

此协程函数主要用于执行 IO-bound 函数/方法,否则如果它们在主线程中运行,它们会阻塞事件循环。例如:

def blocking_io():
    print(f"start blocking_io at {time.strftime('%X')}")
    # Note that time.sleep() can be replaced with any blocking
    # IO-bound operation, such as file operations.
    time.sleep(1)
    print(f"blocking_io complete at {time.strftime('%X')}")

async def main():
    print(f"started main at {time.strftime('%X')}")

    await asyncio.gather(
        asyncio.to_thread(blocking_io),
        asyncio.sleep(1))

    print(f"finished main at {time.strftime('%X')}")


asyncio.run(main())

# Expected output:
#
# started main at 19:50:53
# start blocking_io at 19:50:53
# blocking_io complete at 19:50:54
# finished main at 19:50:54

在任何协程中直接调用 blocking_io() 会在其持续时间内阻塞事件循环,从而导致额外的 1 秒运行时间。相反,通过使用 asyncio.to_thread() ,我们可以在单独的线程中运行它而不会阻塞事件循环。

注意

由于 GIL,asyncio.to_thread() 通常只能用于使 IO-bound 函数非阻塞。但是,对于发布 GIL 的扩展模块或没有 GIL 的替代 Python 实现,asyncio.to_thread() 也可用于CPU-bound 函数。

3.9 版中的新函数。

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 asyncio.to_thread。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。