У меня есть простой кусок кода, который некоторое время сводит меня с ума. Несколько дней назад я разместил этот вопрос с вопросом create_task
не работает с input
. Теперь я выяснил что-то связанное с этим. Я запускаю цикл обработки событий в отдельном потоке и помещаю в него задачи. Очень простой код.
import asyncio
import threading
async def printer(message):
print(f'[printer] {message}')
def loop_runner(loop):
loop.run_forever()
if __name__ == '__main__':
event_loop = asyncio.get_event_loop()
t = threading.Thread(target=loop_runner, args=(event_loop,))
t.start()
for m in ['hello', 'world', 'foo', 'bar']:
print(f'[loop running ?] {event_loop.is_running()}')
event_loop.create_task(printer(m))
Ничего не печатается, кроме этих сообщений журнала.
[loop running ?] True
[loop running ?] True
[loop running ?] True
[loop running ?] True
Теперь, если я заблокирую поток потока событий и позволю ему работать после такой паузы.
def loop_runner(loop):
time.sleep(1 / 1000)
loop.run_forever()
Все работает и печатается
[loop running ?] False
[loop running ?] False
[loop running ?] False
[loop running ?] False
[printer] hello
[printer] world
[printer] foo
[printer] bar
На первый взгляд, задачи, созданные в цикле обработки событий, не выполняются. Но почему это так?
Я ничего не видел в документации. В большинстве примеров, которые я видел в Интернете, люди в цикле создают задачи из других сопрограмм и ожидают их. Но я думаю, что законно использовать задачи создания вне сопрограмм, если вы не хотите их ждать.