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异步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于python实现简单网页服务器代码实例

    基于python实现简单网页服务器代码实例

    这篇文章主要介绍了基于python实现简单网页服务器代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • python简单实现矩阵的乘,加,转置和逆运算示例

    python简单实现矩阵的乘,加,转置和逆运算示例

    这篇文章主要介绍了python简单实现矩阵的乘,加,转置和逆运算,结合实例形式分析了Python针对矩阵的乘,加,转置和求逆等运算相关实现技巧,需要的朋友可以参考下
    2019-07-07
  • python变量不能以数字打头详解

    python变量不能以数字打头详解

    下面小编就为大家带来一篇python变量不能以数字打头详解。小编觉得挺不错的,现在就分享给大家。也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • python用分数表示矩阵的方法实例

    python用分数表示矩阵的方法实例

    这篇文章主要给大家介绍了关于python如何利用分数表示矩阵的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python 图像对比度增强的几种方法(小结)

    Python 图像对比度增强的几种方法(小结)

    这篇文章主要介绍了Python 图像对比度增强的几种方法(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python3+PyQt5使用数据库窗口视图

    python3+PyQt5使用数据库窗口视图

    这篇文章主要为大家详细介绍了python3+PyQt5使用数据库窗口视图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 对python中数组的del,remove,pop区别详解

    对python中数组的del,remove,pop区别详解

    今天小编就为大家分享一篇对python中数组的del,remove,pop区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • 详解如何使用Python操作MySQL的各种功能

    详解如何使用Python操作MySQL的各种功能

    当今互联网时代,数据处理已经成为了一个非常重要的任务。MySQL作为一款开源的关系型数据库,被广泛应用于各种场景。本文将介绍如何使用Python操作MySQL的各种功能,以及一些高级用法,希望对大家有所帮助
    2023-04-04
  • Python如何将函数值赋给变量

    Python如何将函数值赋给变量

    这篇文章主要介绍了Python如何将函数值赋给变量,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用python验证代理ip是否可用的实现方法

    使用python验证代理ip是否可用的实现方法

    验证代理IP是否可用。原理是使用代理IP访问指定网站,如果返回状态为200,表示这个代理是可以使用的。这篇文章重点给大家介绍使用python验证代理ip是否可用的实现方法,感兴趣的朋友一起看看吧
    2018-07-07

最新评论