Python 3.5+Асинхронное программированиефункция
asyncio.run_coroutine_threadsafe()
связь с потоками
Отправляет корутину в цикл событий, работающий в другом потоке, и возвращает concurrent.futures.Future для ожидания результата.
Синтаксис
future = asyncio.run_coroutine_threadsafe(coro, loop)
Это мост из обычного потока в цикл: из рабочего потока нельзя звать create_task, а эта функция потокобезопасна. Возвращается Future из concurrent.futures, его ждут через fut.result(timeout) — блокирующе. Вызвать result() в потоке самого цикла значит повесить программу: цикл ждёт сам себя. Цикл передают явно, потому что в чужом потоке текущего цикла нет.
Примеры
import asyncio
async def add(a, b):
await asyncio.sleep(0.01)
return a + b
def worker(loop):
fut = asyncio.run_coroutine_threadsafe(add(2, 3), loop)
return fut.result(timeout=1) # блокирует рабочий поток, а не цикл
async def main():
loop = asyncio.get_running_loop()
print(await asyncio.to_thread(worker, loop)) # → 5
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности