我有一段简单的代码让我发疯了一段时间。我已经发帖了this https://stackoverflow.com/questions/56350166/python-event-loop-does-not-work-properly-with-stdin前几天问的问题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
从表面上看,在运行事件循环中创建的任务似乎没有被执行。但这是为什么呢?
我在文档中没有看到任何与此相关的内容。在我在互联网上看到的大多数示例中,人们都在从其他协程循环中创建任务并等待它们。但我认为如果您不想等待它们,那么在协程之外使用创建任务是合法的。