问题:
在《每日一课》Python入门之异步IO中,存在着这样一个问题,代码如下:
import asyncio @asyncio.coroutine def hello(): print("Hello world!") # 异步调用asyncio.sleep(1): r = yield from asyncio.sleep(1) print("Hello again!") # 获取EventLoop: loop = asyncio.get_event_loop() # 执行coroutine loop.run_until_complete(hello()) loop.close()
这个程序是没有问题的,但是当我们第二次使用loop的时候程序就会抛出异常RuntimeError: Event loop is closed
,这也是有一定道理的,我们理想当中的的情况也应该是在一个时间循环中解决掉各种异步IO的问题。但是因为我们是处于练习写程序、学习的状态,所以每次如果总是要重启终端再来编写程序进行练习的话,确实过于麻烦了,所以现在就介绍一种解决方法(当然方法很多的,各有各的不同)。
方法:
可以使用asyncio.new_event_loop
函数建立一个新的事件循环,这时候就可以多次运行异步的事件循环了。
结果:
上面的代码可以修改如下:
import asyncio @asyncio.coroutine def hello(): print("Hello world!") # 异步调用asyncio.sleep(1): r = yield from asyncio.sleep(1) print("Hello again!") def runEventLoop(): loop = asyncio.new_event_loop() #asyncio.set_event_loop(loop) loop.run_until_complete(hello()) loop.close() runEventLoop()这样就可以对代码进行自己想要的修改,而且可以反复执行并不会抛出异常: RuntimeError: Event loop is closed