Python asyncio异步编程常见问题小结
作者:永远是少年啊 发布时间:2023-10-04 23:13:56
今天继续给大家介绍Python相关知识,本文主要内容是Python asyncio异步编程常见问题。
一、asyncio编程简单示例
首先,我们来看一段简单的Python asyncio异步编程代码,相关代码如下所示:
import asyncio
async def fun():
print(1)
await asyncio.sleep(2)
print(2)
return 3
async def main():
task_list=[
asyncio.create_task(fun()),
asyncio.create_task(fun())
]
done,pending=await asyncio.wait(task_list)
print(done)
asyncio.run(main())
在上述代码中,我们使用了Task列表,将两个fun()协程函数生成的Task对象添加到task列表中,最终实现了这两个函数异步执行。上述代码执行结果如下所示:
二、asyncio编程常见问题
下面,我们想要简单的修改一下上述代码,我们把main()函数删除,尝试直接生成协程对象列表,结果如下所示:
import asyncio
async def fun():
print(1)
await asyncio.sleep(2)
print(2)
return 3
task_list=[
asyncio.create_task(fun()),
asyncio.create_task(fun())
]
done,pending=asyncio.run(asyncio.wait(task_list))
print(done)
上述代码执行结果如下所示:
三、报错原因及解决方案
从上图中可以看出,上述代码执行报错,错误提示为:RuntimeError:no running event loop。
其实,之所以出现上述报错,直接原因在于当前没有事件循环。当我们使用asyncio模块来实现异步编程时,asyncio模块的优点在于省略了我们创建事件循环的过程,但是这并不意味着asyncio异步编程不需要事件循环。事实上,在第一段代码中,代码:
asyncio.run(main())
在实际上创建了这个事件循环,但是asyncio模块屏蔽了这一细节。而正是因为已经存在了事件循环,因此我们才可以执行命令:
done,pending=await asyncio.wait(task_list)
但是在上述代码中,我们没有创建事件循环,而是直接将该代码放到主程序中执行,因此上述代码会出现报错。
针对上述代码,我们可以简单修改为以下内容:
import asyncio
async def fun():
print(1)
await asyncio.sleep(2)
print(2)
return 3
task_list=[
fun(),
fun()
]
done,pending=asyncio.run(asyncio.wait(task_list))
print(done)
在上述代码中,我们的Task列表中存放的是协程对象,而不是Task对象,这样,我们在执行asyncio.wait时会自动创建一个事件循环,并且把协程对象加入到事件循环中。因此上述代码也就不会报错了。执行结果如下所示:
来源:https://blog.csdn.net/weixin_40228200/article/details/128624839


猜你喜欢
- 1、str.split不支持正则及多个切割符号,不感知空格的数量,比如用空格切割,会出现下面情况。>>> s1="
- 字符串操作字符串 + 运算符+运算符用于连接字符串,返回一个由连接在一起的操作数组成的字符串。>>> s = 'a
- 代码如下:--相信大家肯定经常会把数据导入到数据库中,但是可能会有些记录行的所有列的数据是null,这为null的数据是我们不需要 --现在
- 开发的很多场景中都会用到手机号的校验和验证码的校验,具体实现如下<div> <input type="text&
- 在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select
- 正在看的ORACLE教程是:在ORACLE移动数据库文件。  
- 一,编程环境PyCharm2016,Anaconda3 Python3.6需要安装schedule模块,该模块网址:https://pypi
- 前言去年在做golangserver的时候,内部比较头疼的就是在线服务发布的时候,大量用户的请求在发布时候会被重连,在那时候也想了n多的方法
- 相信大家对阶乘都不陌生。不知道阶乘的可以看这里:一个数的阶乘:比如5的阶乘在python中大部分教程一般推荐用递归函数完成:#!/usr/b
- 本文实例讲述了Python判断一个list中是否包含另一个list全部元素的方法。分享给大家供大家参考,具体如下:你可以用for in循环+
- 如果你还在为python的各种urllib和urlibs,cookielib 头疼,或者还还在为python模拟登录和抓取数据而抓狂,那么来
- 基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的
- 目录什么是 assert 断言断言和异常的使用场景使用断言的几个原则建议不使用断言的情况:总结什么是 assert 断言Assert sta
- PyCharm是一款很好用很流行的python编辑器。Anaconda是专注于数据分析的Python发行版本,包含了conda、Python
- 炸金花题目很简单:就是自己写一个程序,实现诈金花游戏的发牌、判断输赢。规则:一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。牌
- 1.文件写入#打开文件,路径不对会报错f = open(r"C:\Users\jm\Desktop\pyfile.txt"
- 先看示例i=1menu=["B超室","化验室"]user="张来,黎明,常冒
- Python的版本是挺折腾人的,本着简单实用的原则我介绍一下我是如何安装多版本Python的。环境:windows10(64位)Python
- 在修改后的 《闲谈 Web 图片服务器》 一文中也提及了"IE 浏览器的连接数问题",这也是个有趣的话题。值得补充记录一
- asp按关键字查询XML的问题 '-------------------------------------------------