Проблема с Python3 Asyncio создания задач - PullRequest
0 голосов
/ 25 января 2019

Проработал большинство примеров, но все еще изучаю асинхронность в Python. У меня возникли проблемы, почему этот пример кода не будет печатать "Я асинхронный".

import asyncio
from threading import Thread

async def cor1():
   print("i am async!")

def myasync(loop):
   print("Async running")
   loop.run_forever()
   print("Async ended?")

def main():
   this_threads_event_loop = asyncio.get_event_loop()
   t_1 = Thread(target=myasync, args=(this_threads_event_loop,));
   t_1.start()
   print("begining the async loop")
   t1 = this_threads_event_loop.create_task(cor1())
   print("Finsihed cor1")

main()

1 Ответ

0 голосов
/ 25 января 2019

Ваш код пытается отправить задачи в цикл событий из другого потока. Для этого необходимо использовать 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.

...