Ваш код пытается отправить задачи в цикл событий из другого потока. Для этого необходимо использовать run_coroutine_threadsafe
:
def main():
loop = asyncio.get_event_loop()
# start the event loop in a separate thread
t_1 = Thread(target=myasync, args=(loop,));
t_1.start()
# submit the coroutine to the event loop running in the
# other thread
f1 = asyncio.run_coroutine_threadsafe(cor1(), loop)
# wait for the coroutine to finish, by asking for its result
f1.result()
print("Finsihed cor1")
Обратите внимание, что объединение asyncio и потоков должно выполняться только в особых обстоятельствах, например, при внедрении asyncio в устаревшем приложении, где новые функции необходимо добавлять постепенно. Если вы пишете новый код, вы почти наверняка захотите, чтобы main
был сопрограммой, запускается с верхнего уровня с помощью asyncio.run(main())
.
Для запуска устаревшей синхронной функции из асинхронного кода вы всегда можете использовать run_in_executor
.