首页 > 其他分享 >async await重新理解

async await重新理解

时间:2023-06-01 21:22:04浏览次数:36  
标签:异步 await 任务 理解 print async asyncio

去年python学async await时候完全没有理解,写出来很多伪异步代码,现在重新理解

await是挂起当前协程,然后运行其他携程

示例1

# 定义一个异步函数
async def count_up_to(number):
    print("开始计数")
    for i in range(1, number + 1):
        print(i)
        await asyncio.sleep(1)  # 模拟耗时操作
    print("计数完成")

# 创建一个异步任务并执行
async def main():
    task = asyncio.create_task(count_up_to(5))  # 创建异步任务
    # input()
    print("执行其他任务")
    await asyncio.sleep(2)  # 模拟执行其他任务的耗时
    print("完成其他任务")
    await task  # 等待异步任务完成

asyncio.run(main())

如果await后面接的是一个异步函数,那它会挂起当前而运行其他协程,按照这样的理解,main里面创建了一个新的携程任务task,当运行到await asyncio.sleep(2)时运行task(执行另一个任务)
实际上上面那段代码等于

import asyncio
import time
# 定义一个异步函数
async def count_up_to(number):
    print("开始计数")
    for i in range(1, number + 1):
        print(i)
        await asyncio.sleep(1)  # 模拟耗时操作
    print("计数完成")

# 创建一个异步任务并执行
async def main():
    # input()
    print("执行其他任务")
    await asyncio.sleep(2)  # 模拟执行其他任务的耗时
    print("完成其他任务")
    await task  # 等待另一个异步任务完成
async def tasks():
    tasks = []
    tasks.append(asyncio.create_task(main()))
    tasks.append(asyncio.create_task(count_up_to(5)))
    await asyncio.gather(*tasks)
# 运行主程序
asyncio.run(tasks())

错误代码

# 定义一个异步函数
async def count_up_to(number):
    print("开始计数")
    for i in range(1, number + 1):
        print(i)
        await asyncio.sleep(1)  # 模拟耗时操作
    print("计数完成")

# 创建一个异步任务并执行
async def main():
    await count_up_to(5)  # 创建异步任务
    # input()
    print("执行其他任务")
    await asyncio.sleep(2)  # 模拟执行其他任务的耗时
    print("完成其他任务")
    await task  # 等待异步任务完成

再看这段,await运行count_up_to时实际是挂起然后没有别的协程可以运行,所以直接阻塞等待count_up_to(5)运行完之后运行后面代码

所以我们运行aiohttp请求多个url要生成一串任务然后请求,而不是for直接套await(绷不住了)

标签:异步,await,任务,理解,print,async,asyncio
From: https://www.cnblogs.com/znsbc-13/p/17450217.html

相关文章

  • if if else else 多选的理解
    packagecom.fqs.test;importjava.util.Scanner;publicclasshello{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.print("请在键盘输入1到100间的儿子成绩");intmy_num=sc.nextInt();//键盘......
  • R数据分析:多项式回归与响应面分析的理解与实操
    今天给大家分享一个新的统计方法,叫做响应面分析,响应面分析是用来探究变量一致性假设的(Congruencehypotheses)。本身是一个工程学方法,目前在组织行为学,管理,市场营销等等领域中使用越来越多。Congruencehypothesesstatethattheagreement(i.e.,congruence)betweentwoconst......
  • 立flag 理解 if else分支
    packagecom.fqs.test;publicclasshello{publicstaticvoidmain(String[]args){booleanflag=true;//立一个flag开始走分支真代表能喝;假代表不能喝if(flag)//flag为真,能喝System.out.print("能喝!");else{Sy......
  • ROS2-Beginner:7-理解行为
    背景行为ROS2中的一种通信类型,用于长时间的运行任务。由三个部分组成:目标,反馈以及结果。行为建立在话题和服务之上的。他们的功能类似于服务,但可以取消操作。他们还提供了稳定的反馈,而不是返回单一的响应的服务。行为使用了一个客户端-服务器模型,类似于发布者和订阅者。一个行......
  • ROS2-Beginner:5-理解服务
    背景服务是rosgraph中另一种通信方法。服务是基于调用和响应相比话题是发布者和订阅者模式。话题允许节点来订阅数据流并获得连续的更新。服务只当被具体客户端调用时才提供数据。任务1、打开turtlesim仿真器ros2runturtlesimturtlesim_noderos2runturtlesimturtle......
  • ROS2-Beginner:3-理解节点
    目标:学习ROS2中节点的功能,以及与他们交互的工具背景1、ROS2graphROS图是ROS2元素同时一起处理数据的网络。它包含了所有可执行文件以及它们之间的连接,如果您要将它们全部映射出来并可视化的话。2、在ROS2中的节点在ROS中的每一个节点都应该负责单一的模块化目的,例如控制车轮......
  • Base64学习理解
    Base64是用64个可打印的字符来描述数据的编码方式为什么要整这个Base64呢,那是因为有的时候我们需要以可打印的字符串的形式传递数据,比如url传递之类的假设有个4字节的数据[97,32,245,0],我们要把它转成可打印的字符串的形式,首先不能直接把它转成字符串,因为ASCII中有不可打印......
  • 软件测试的理解
      IEEE定义:使用人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。    测试对象:软件需求、软件概要设计、软件详细设计、软件源代码、可运行程序、软件运行环境。覆盖到软件研发过程中的方方面面    五大要素......
  • AsyncTask 异步任务基本使用-下载视频
    概述android提供了一个异步任务类AsyncTask,使创建异步任务、更新UI变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。本例子将演示并实现,使用AsyncTask来下载视频。详细一、准备工作开发环境:jdk1.8EclipseLunaServiceRelease1(4.4.1)运行环......
  • Revit二次开发系列教程01-如何在Revit中创建模型过程的理解
    目录01案例02步骤讲解03关键类理解04总结05源码地址01案例创建一个结构墙usingAutodesk.Revit.Attributes;usingAutodesk.Revit.DB;usingAutodesk.Revit.UI;usingSystem.Linq;namespaceExampleBasic{[Transaction(TransactionMode.Manual)][Regener......