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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 日期和时间类型MySQL有多个表示各种日期和时间值的数据类型, 比如YEAR和DATE. MySQL存储时间的最精确粒度是秒。 然而, 能做
- 很多人在使用AJAX调用别人站点内容的时候,JS会提示"没有权限"错误,这是XMLHTTP组件的限制-安全起见禁止访问非
- 要读懂这些代码主要是要了解ASP中操作二进制数据的对象ADODB.Stream!本程序主要用的就是Adodb.Stream,如果你有这个基础
- 很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。下面我来举几个例子。1. 删除重
- 1.函数array() 功能:创建一个数组变量 格式:array(list) 参数:list为数组变量中的每个数值列,中间用逗号间隔 例子:
- 一、若出现404错误,自动跳转到所在目录的首页;二、若当前页本身是目录首页,则自动跳转至上一级目录的默认首页。自定义404页面代码如下:&l
- <% '#######以下是一个类文件,下面的注解是调用类的方法#########################
- $str=preg_replace("/\s+/", " ", $str); //过滤多余回车 $s
- subprocess.run()运行并等待args参数指定的指令完成,返回CompletedProcess实例。参数:(*popenargs
- 对于数字索引数组来说,通过 array_push()函数向数组中添加元素。array_push()函数将数组当成一个栈,将传入的变量压入该数
- Web,全称为 World Wide Web,是 Internet 上最重要和最为人们所熟知的应用之一。Web 是指 Internet 上所
- 应该是很方便的了,支持几乎所有主流浏览器(ie5,6,7,8;ff;傲游;Opera)已更新至可提交录入内容<script type=
- 1.什么是并发编程并发编程是实现多任务协同处理,改善系统性能的方式。Python中实现并发编程主要依靠进程(Process):进程是计算机中
- 说到Javascript的类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。无参数类继承的问题先看一段示例代码,实现B继承于
- 1. 引言在本文中,我们将研究从列表中选择随机元素的不同实现方法。在日常项目中,我们经常会遇到这种情形,比如随机从多种数据增强策略中选择一种
- 1. PHP入侵检测系统PHP IDS(即PHP-入侵检测系统)是一套易于使用、结构良好、速度出色且专门面向PHP类Web应用程序的先进安全
- 前言当我们在用python时可能会遇到想要把txt文档里的数据读取出来然后进行绘图,那么我们要怎么才能够将txt里的数据读取出来呢?假设有t
- 本文实例讲述了python连接字符串的方法。分享给大家供大家参考。具体如下:方法1:直接通过加号操作符相加foobar = 'foo
- 本文实例讲述了php控制文件下载速度的方法。分享给大家供大家参考。具体实现方法如下:<?php /* * set here a lim
- 1、先介绍如何用PHP连上数据库(数据库用户名“root”,密码“sun”,有库“myguestbook”) 图62、PHP和My