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

 更新时间:2023年01月18日 09:18:56   作者:永远是少年啊  
本文主要介绍了Python asyncio异步编程常见问题小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

今天继续给大家介绍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时会自动创建一个事件循环,并且把协程对象加入到事件循环中。因此上述代码也就不会报错了。执行结果如下所示:

到此这篇关于Python asyncio异步编程常见问题小结的文章就介绍到这了,更多相关Python asyncio异步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Flask框架使用DBUtils模块连接数据库操作示例

    Flask框架使用DBUtils模块连接数据库操作示例

    这篇文章主要介绍了Flask框架使用DBUtils模块连接数据库操作,结合实例形式较为详细的分析了flask框架使用DBUtils模块连接数据库的常见操作技巧与相关注意事项,需要的朋友可以参考下
    2018-07-07
  • Python之torch.no_grad()函数使用和示例

    Python之torch.no_grad()函数使用和示例

    这篇文章主要介绍了Python之torch.no_grad()函数使用和示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Django model 中设置联合约束和联合索引的方法

    Django model 中设置联合约束和联合索引的方法

    今天小编就为大家分享一篇Django model 中设置联合约束和联合索引的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python pexpect ssh 远程登录服务器的方法

    python pexpect ssh 远程登录服务器的方法

    今天小编就为大家分享一篇python pexpect ssh 远程登录服务器的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python 实现仿微信聊天时间格式化显示的代码

    python 实现仿微信聊天时间格式化显示的代码

    这篇文章主要介绍了python 实现仿微信聊天时间格式化显示,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-04-04
  • pytorch+sklearn实现数据加载的流程

    pytorch+sklearn实现数据加载的流程

    这篇文章主要介绍了pytorch+sklearn实现数据加载,之前在训练网络的时候加载数据都是稀里糊涂的放进去的,也没有理清楚里面的流程,今天整理一下,加深理解,也方便以后查阅,需要的朋友可以参考下
    2022-11-11
  • Python对象转JSON字符串的方法

    Python对象转JSON字符串的方法

    这篇文章主要介绍了Python对象转JSON字符串的方法,涉及Python基于json模块实现json转换的实现技巧,非常简便易懂,需要的朋友可以参考下
    2016-04-04
  • Python opencv进行圆形识别(圆检测)实例代码

    Python opencv进行圆形识别(圆检测)实例代码

    最近工作的项目上需要检测图像中是否有圆形,下面这篇文章主要给大家介绍了关于Python opencv进行圆形识别(圆检测)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Python数据库编程之pymysql详解

    Python数据库编程之pymysql详解

    本文主要介绍了Python数据库编程中pymysql,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 使用Python在Word中插入图片并文字环绕的方法

    使用Python在Word中插入图片并文字环绕的方法

    在Word文档中插入图片能够提供更直观的信息,插入图片时,我们还可以调整图片大小,以及设置合适的文字环绕方式,本文将提供两种使用Python在Word文档中插入图片并设置文字环绕的方法,需要的朋友可以参考下
    2024-06-06

最新评论