用法:
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 asyncio.BaseTransport.get_extra_info用法及代码示例
- Python asyncio.shield用法及代码示例
- Python asyncio.run用法及代码示例
- Python asyncio.wait_for用法及代码示例
- Python asyncio.create_task用法及代码示例
- Python asyncio.Task.cancel用法及代码示例
- Python asyncio.loop.run_in_executor用法及代码示例
- Python asyncio.Server用法及代码示例
- Python asyncio.Server.serve_forever用法及代码示例
- Python asyncio.Event用法及代码示例
- Python asyncio.gather用法及代码示例
- Python asyncio.sleep用法及代码示例
- Python asyncio.Condition用法及代码示例
- Python asyncio.SelectorEventLoop用法及代码示例
- Python asyncio.run_coroutine_threadsafe用法及代码示例
- Python asyncio.Lock用法及代码示例
- Python asyncio.Future.add_done_callback用法及代码示例
- Python asyncio.loop.shutdown_asyncgens用法及代码示例
- Python asyncio.as_completed用法及代码示例
- Python asyncio.Semaphore用法及代码示例
注:本文由纯净天空筛选整理自python.org大神的英文原创作品 asyncio.to_thread。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。