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列表中,最终实现了这两个函数异步执行。上述代码执行结果如下所示:

Python asyncio异步编程常见问题小结

二、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)

上述代码执行结果如下所示:

Python asyncio异步编程常见问题小结

三、报错原因及解决方案

从上图中可以看出,上述代码执行报错,错误提示为: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时会自动创建一个事件循环,并且把协程对象加入到事件循环中。因此上述代码也就不会报错了。执行结果如下所示:

Python asyncio异步编程常见问题小结

来源:https://blog.csdn.net/weixin_40228200/article/details/128624839

标签:Python,asyncio,异步
0
投稿

猜你喜欢

  • sqlserver 三种分页方式性能比较[图文]

    2011-09-30 11:16:20
  • python中getattr函数使用方法 getattr实现工厂模式

    2021-02-25 00:34:30
  • webpack css加载和图片加载的方法示例

    2024-04-22 13:02:13
  • django admin后管定制-显示字段的实例

    2023-07-01 11:34:18
  • Django学习笔记之为Model添加Action

    2021-04-09 16:32:26
  • 浅谈mysql增加索引不生效的几种情况

    2024-01-25 20:34:43
  • 使用python进行nc转tif的3种情况解决

    2022-05-09 11:22:43
  • Oracle不同数据库间对比分析脚本

    2010-07-26 13:24:00
  • Django1.11自带分页器paginator的使用方法

    2021-07-04 12:44:23
  • Python while、for、生成器、列表推导等语句的执行效率测试

    2021-03-05 02:17:54
  • Python调用API接口实现人脸识别

    2022-09-10 22:42:20
  • python实现在pandas.DataFrame添加一行

    2022-04-14 01:53:23
  • Python3 单行多行万能正则匹配方法

    2023-03-22 13:47:33
  • python读取文件名并改名字的实例

    2021-03-19 12:45:37
  • Python使用pymysql从MySQL数据库中读出数据的方法

    2024-01-26 15:26:24
  • Linux下安装Python3和django并配置mysql作为django默认服务器方法

    2023-11-15 01:04:44
  • numpy中的delete删除数组整行和整列的实例

    2022-11-24 22:09:01
  • python多进程基础详解

    2021-07-14 10:06:52
  • pyqt5蒙版遮罩mask,setmask的使用

    2022-04-05 21:00:58
  • 未知高度的图片垂直居中

    2010-12-17 12:36:00
  • asp之家 网络编程 m.aspxhome.com