當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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