在Python的一段程序中如何使用多次事件循环详解

yipeiwu_com6年前Python基础

背景

本文主要给大家介绍了关于在Python一段程序中使用多次事件循环的相关内容,我们在Python异步程序编写中经常要用到如下的结构

import asyncio
async def doAsync():
 await asyncio.sleep(0)
 #...
if __name__ == "__main__":
 loop = asyncio.get_event_loop()
 loop.run_until_complete(doAsync())
 loop.close()

这当然是很不错的,但当你第二次使用loop的时候程序就会抛出异常RuntimeError: Event loop is closed,这也无可厚非,理想的程序也应该是在一个时间循环中解决掉各种异步IO的问题。

但放在终端环境如Ipython中,如果想要练习Python的异步程序的编写的话每次都要重新开启终端未免太过于麻烦,这时候要探寻有没有更好的解决方案。

解决方案

我们可以使用asyncio.new_event_loop函数建立一个新的事件循环,并使用asyncio.set_event_loop设置全局的事件循环,这时候就可以多次运行异步的事件循环了,不过最好保存默认的asyncio.get_event_loop并在事件循环结束的时候还原回去。

最终我们的代码就像这样。

代码

import asyncio
async def doAsync():
 await asyncio.sleep(0)
 #...
def runEventLoop()
 loop = asyncio.new_event_loop()
 asyncio.set_event_loop(loop)
 loop.run_until_complete(doAsync())
 loop.close()
if __name__ == "__main__":
 oldloop = asyncio.get_event_loop()
 runEventLoop()
 runEventLoop()
 asyncio.set_event_loop(oldloop)

感想

事件循环本来就是要一起做很多事情,在正式的Python代码中还是只用一个默认的事件循环比较好,平时的学习练习的话倒是随意了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对【听图阁-专注于Python设计】的支持。

相关文章

windows 10下安装搭建django1.10.3和Apache2.4的方法

windows 10下安装搭建django1.10.3和Apache2.4的方法

环境介绍 python3.5.2 64位 django 1.10.3 apache 2.4 64位 windows 10 重点在apache上。 python 和dj...

Python 专题六 局部变量、全局变量global、导入模块变量

Python 专题六 局部变量、全局变量global、导入模块变量

定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域。本文主要讲述全局变量、局部变量和导入模块变量的方法。 参考:《Python核心编程 (第二版)》 一. 局部变量...

pygame实现俄罗斯方块游戏(基础篇3)

pygame实现俄罗斯方块游戏(基础篇3)

上一章请点击查看:pygame实现俄罗斯方块游戏(基础篇2) 现在继续 一、给每个方块设置不同的颜色 根据代码这里可以判断正在下落的方块在那些Block子类里加一个属性最合适,而已经落下...

python 实现兔子生兔子示例

如下所示: # -*- coding: utf-8 -*- # 简述:话说有一对可爱的兔子,出生后的第三个月开始,每一月都会生一对小兔子。 # 当小兔子长到第三个月后,也会每个月再生...

python opencv 简单阈值算法的实现

python opencv 简单阈值算法的实现

本文先了解一个简单阈值函数,以了解一个阈值算法的具体参数。 然后比较不同阈值函数的区别。 同样的,先用一副图说明本文重要大纲: #! usr/bin/env python...