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
投稿

猜你喜欢

  • 存贮查询与运行时查询孰优孰劣?

    2009-11-01 15:13:00
  • python导入模块交叉引用的方法

    2021-11-01 07:03:42
  • Yahoo! BrowserPlus 介绍

    2008-06-01 16:38:00
  • python中的np.argmax() 返回最大值索引号

    2022-08-07 14:22:57
  • 对IPython交互模式下的退出方法详解

    2021-08-04 10:03:11
  • 在ASP.NET2.0通过SMTP的验证发送EMAIL

    2007-09-23 12:29:00
  • HTML5设计原则

    2012-04-26 16:46:45
  • PHP curl get post 请求的封装函数示例【get、post、put、delete等请求类型】

    2023-05-25 01:24:18
  • 减少SQL Server死锁的方法

    2009-01-05 13:49:00
  • python数据分析之单因素分析线性拟合及地理编码

    2021-02-09 06:46:20
  • 浅谈Scrapy框架普通反爬虫机制的应对策略

    2023-07-14 17:11:40
  • python各种语言间时间的转化实现代码

    2022-06-27 14:54:28
  • 作为Web开发人员,我为什么喜欢Google Chrome浏览器

    2011-08-29 15:37:47
  • asp金额大小写转换完全无错版

    2007-09-26 09:38:00
  • PHP文件操作详解

    2023-11-20 07:44:25
  • ASP如何使用CDONTS来发送电子邮件?

    2010-06-05 12:35:00
  • SQL Server日志文件总结及日志满的处理

    2009-03-25 16:17:00
  • php基于PDO实现功能强大的MYSQL封装类实例

    2023-11-16 22:50:27
  • Ajax发明人:Ajax并不适合所有网站

    2008-01-30 12:20:00
  • PHP排序二叉树基本功能实现方法示例

    2023-07-10 04:45:53
  • asp之家 网络编程 m.aspxhome.com