用法:
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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。