您现在的位置是:首页 > 正文

Python asyncio异步编程常见问题

2024-02-01 02:58:12阅读 2

今天继续给大家介绍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

网站文章

  • L2-033 简单计算器(Python3)

    L2-033 简单计算器(Python3)

    团体程序设计天梯赛-练习集

    2024-02-01 02:58:06
  • 基于CART树的银行贷款风控模型实现

    基于CART树的银行贷款风控模型实现

    基于CART树的银行贷款风控模型实现

    2024-02-01 02:57:36
  • 服务器系统吞吐量是否就是带宽,【经验分享】Iperf测试网络吞吐量的方法

    服务器系统吞吐量是否就是带宽,【经验分享】Iperf测试网络吞吐量的方法

    Iperf测试:使用udp设定带宽2M,5M,10M,同时观察对正进行的ping测试的影响。证明iperf使用udp测试/使用一定或最大带宽时,同样能影响tcp协议的流量。任务(1) (使用UDP,参数-u -b 2M)设定不同带宽#iperf3-c192.168.199.18-p54321-i1-t1800-u-b1M(2) 双向同时测试(在任一端多开一个iperf por...

    2024-02-01 02:57:29
  • 阿里云ECS最新的实例规格族有哪些

    阿里云ECS最新的实例规格族有哪些

    通过本文您可以了解目前阿里云在售的所有ECS实例规格族的信息,包括每种规格族的特点,适用场景,以及如何选择符合自己需求的实例规格族。 什么是阿里云ECS实例 实例是能够为您的业务提供计算服务的最小单位,它是以一定的规格来为您提供相应的计算能力的。 根据业务场景和使用场景,ECS实例可以分为多种规格族。同一个规格族里,根据CPU和内...

    2024-02-01 02:57:22
  • android shell hello world,Android Framework 之HelloWorld(三)

    本来是要写一个linux驱动,用于控制led灯的,但考虑到nanopc-T4的内核已经帮我们配置好设备树,已经可以利用/sys/class/gpio操作gpio了,所以没必要再造轮子了!在shell里,可以利用下面的命令控制Led灯的亮与灭:#导出GPIO0_A0管脚echo 32 > /sys/class/gpio/export#让GPIO0_A0管脚作为输出使用echoout >...

    2024-02-01 02:56:52
  • ACM题目里求组合数C(n,m)的方法

    (212条消息) 组合数c(n,m)计算的四种方法_wjl_zyl_1314的博客-CSDN博客_c计算组合数static long[][] longs=new long[2000][1000];//...

    2024-02-01 02:56:43
  • 执行Django 的迁移命令报错[1193, Unknown system variable default_storage_engine]

    执行Django 的迁移命令报错[1193, Unknown system variable default_storage_engine]

    执行Django 的迁移命令报错[1193, Unknown system variable default_storage_engine]

    2024-02-01 02:56:36
  • Android随机点名器,Excel基础知识-详解随机点名器

    Android随机点名器,Excel基础知识-详解随机点名器

    说道制作个案例纯粹意外,我多少有点选择恐惧症,为了不在“选择”上纠结,就自己小玩了一下,就用了程序做了个选择器,其实很简单,就是有小时候玩的“点兵点将",稍微变化就成今天的案例!我一直的原则是用最少的...

    2024-02-01 02:56:30
  • Dubbo的负载均衡策略有哪些?

    主要有random(随机,这种是默认的负载均衡策略)、RoundRobin (轮询)、LeastActive (最少活跃数)、ConsistentHash(一致性hash)可以在暴露服务的时候使用lo...

    2024-02-01 02:56:01
  • 【OJ比赛日历】快周末了,不来一场比赛吗? #05.13-05.19 #14场

    【OJ比赛日历】快周末了,不来一场比赛吗? #05.13-05.19 #14场

    实时聚合多平台的(Kaggle、天池…)和(Leetcode、牛客…)比赛。本账号同时会推送最新的比赛消息,欢迎关注!更多比赛信息见或 点击文末以下信息仅供参考,以比赛官网为准。

    2024-02-01 02:55:55