Python 3.9+Асинхронное программированиефункция
asyncio.to_thread()
связь с потоками
Выполняет обычную блокирующую функцию в отдельном потоке и даёт дождаться её через await, не останавливая цикл событий.
Синтаксис
result = await asyncio.to_thread(func, /, *args, **kwargs)
Подходит для блокирующего ввода-вывода: requests, чтение файла, time.sleep. Для вычислений ускорения нет — из-за GIL поток считает по очереди с циклом; тут нужен ProcessPoolExecutor через run_in_executor. Отмена await не останавливает поток: функция доработает до конца. В отличие от run_in_executor, to_thread переносит contextvars и принимает именованные аргументы. Появилась в 3.9.
Примеры
import asyncio
import time
def blocking(name):
time.sleep(0.02) # блокирующий вызов
return name
async def main():
results = await asyncio.gather(
asyncio.to_thread(blocking, 'a'),
asyncio.to_thread(blocking, name='b'),
)
print(results) # → ['a', 'b']
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности