一文了解异步编程基础

article/2025/9/18 3:42:50

什么是异步编程?

异步编程是指并发编程的范式,其中除了单个主应用程序线程之外,工作可以委托给一个或多个并行工作线程。这被称为非阻塞系统,其中整体系统速度不受订单执行的影响,并且多个进程可以同时发生。

函数从 API 获取数据需要时间。设计异步编程是为了适应调用函数到返回该函数的值之间的延迟。让我们通过一个例子来理解这一点 -

如果您要创建一个天气应用程序,您可能希望从一个外部 API 获取城市的温度,并从另一个 API 获取风速或降雨可能性。在同步设置中,这将以顺序方式发生,其中第二个 API 请求仅在第一个 API 请求成功完成时发出。随着请求数量的增加,这种延迟会不断增加,从而导致糟糕的用户体验。异步代码允许您以非阻塞方式实现上述内容,以便可以在等待第一个请求完成之前启动第二个请求。

Python 在 Python 3.5 中使用 async/await 语法引入了对异步代码的支持。需要明确的是,Python 采用了单线程、单进程的设计,只给人一种并行的印象,可以称为“协同多任务”。

异步编程允许用户在应用程序中进行他的业务,而进程在后台运行,从而增强了用户体验。

异步编程的工作原理

了解异步编程如何工作的最简单方法是将其与同步编程进行比较。现在来看一个同步编程的例子。

同步编程

同步编程遵循着严格的顺序。当代码在同步程序中运行时,它将遵循算法的每一步。它按顺序执行此操作,并将等待当前操作完成,然后再继续下一个操作。

同步编程遵循“做蛋糕”算法:

  1. 计算原料重量
  2. 混合面粉、鸡蛋和糖
  3. 加热烤箱并烘烤
  4. 吃蛋糕

每一步都必须按顺序进行。在烘烤混合物之前,必须测量原料,必须混合混合物。而且,要尝起来像蛋糕,应该在吃之前先烤好。因为只有一个人在做所有的工作,所以在开始下一个任务之前,您必须完全完成一项任务。同步编程具有单轨思想。它一步一步地遵循指南。

# -*- coding: utf-8 -*-
"""
同步编程:做蛋糕
"""
import threading
import time
from threading import RLockdef Measure():print("Measure the ingredients.")def Mix():print("Mix flour, eggs, and sugar.")def Bake():print("Bake Cake")def Eat():print("Eat your cake")def main():measure = threading.Thread(target=Measure)mix = threading.Thread(target=Mix)bake = threading.Thread(target=Bake)eat = threading.Thread(target=Eat)start_time = time.time()lock = RLock()lock.acquire()measure.start()time.sleep(5)lock.release()lock.acquire()mix.start()time.sleep(3)lock.release()lock.acquire()bake.start()time.sleep(10)lock.release()eat.start()end_time = time.time()print("\n做蛋糕结束,共花费了{}时间".format(end_time - start_time))if __name__ == "__main__":main()

运行结果:

Measure the ingredients.
Mix flour, eggs, and sugar.
Bake Cake
Eat your cake
做蛋糕结束,共花费了18.030949354171753时间

 

异步编程

相比之下,异步蛋糕烘焙允许多人同时完成任务。一个人可以收集和测量成分,而另一个人开始将成分混合在一起。异步编程允许启动多个进程,让进程完成它们的工作,当它们的工作完成时,它会得到结果并完成步骤。

如果烤箱在蛋糕粉完全准备好之前完成加热,异步编程表示没关系。如果没有准备好混合物,同步编程永远不会启动烤箱。混合完成后,它会向算法发送更新以返回并获取混合结果并将其推送到整个过程。现在,准备好蛋糕粉后,可以将其放入已经加热到合适温度的加热烤箱中,准备烘烤蛋糕。

不幸的是,异步编程不会帮助你吃掉你的蛋糕,但它会帮助你更快地完成蛋糕。烘烤必须在你可以吃之前发生。 (而且,如果在蛋糕准备好之前叫食者吃饭,就像在蛋糕混合物准备好之前烤箱是如何加热的,那么吃东西的人可能会在厨房里饥肠辘辘。)

异步函数

异步函数经常出现在前端应用程序中,特别是在独立的、大容量的 IO 任务中使用。前端应用程序受益于它的使用,因为它增强了应用程序的流程。

后端进程可能使用异步函数来运行许多任务或进行大量网络调用。在后端,异步编程允许计算机做更多、更快的事情。它调用许多响应时间不确定的函数并处理结果。一个例子是网络抓取,然后将结果存储在数据库中:这个过程是例行的,结果写入目录的顺序无关紧要——它们只需要有一个文件名。

典型的函数是用 async/await 组合编写的。

async function foo() {const value = await somePromise();return value;
}

常见用例

异步函数最常见的用途是调用 API。因为网络时间和检索是不确定的,异步函数会说,“从网站(或 REST API)获取数据,当它到达这里时,将获取的数据插入回我的脚本中。”

异步函数用于:与 API 交互、减慢应用程序的用户体验

它们还可用于在用户活动中造成延迟。为什么要减慢应用程序的速度?因为计算机可以以非常快的速度做事,而且在执行时,它会让用户感到不安。

因此,设计人员故意减慢应用程序的速度。一条消息几乎可以立即发送给另一个用户。通常,加载圈不是说明消息发送需要时间的必要圈。相反,它之所以存在,是因为它可以帮助用户了解正在发生的事情并让使用该应用程序感觉更舒服。

是的,由于网络延迟,有时需要几秒钟才能发送一条消息。在通过网络发送消息之前,在用户设备上编码消息也需要一些时间。

屏幕上的项目可以立即出现和消失,并且通过动画帮助用户了解屏幕上正在发生的事情。动画可以是异步的,因为当它们在一段时间内执行它们的操作时,其他功能可以在后台运行。

何时使用异步函数

异步并不总是最好的方法。异步程序增加了更多的复杂性,使代码更不可读。年轻的程序员经常会过多地使用异步函数,因为他们认为它可以作为一种保障来确保他们的代码在运行时工作。何时使用异步函数的一般规则:

  • 适用于:可能需要一段时间的任务;高迭代。
  • 不适用于:简单。

当涉及大量迭代或循环内的操作很复杂时,异步循环是必要的。但是对于像遍历一个小数组这样的简单任务,没有理由通过使用复杂的递归函数使事情变得过于复杂。一个简单的同步 for/while 循环工作得很好,而且速度更快,可读性更好。-- Max Galka, mapping founder of blueshift


http://chatgpt.dhexx.cn/article/D0AroWJX.shtml

相关文章

异步函数async

什么是同步异步 在最新的ES7(ES2017)中提出的前端异步特性:async、await。 在了解async和await之前得先明白什么是同步函数,什么是异步函数。 同步函数:当一个函数是同步执行时,那么当该函数被调用时不会…

异步(async、await)

同步与异步 同步:如果一个程序调用某个方法,等待其执行所有处理后才继续执行,我们就称这样的方法是同步的,这是默认的形式异步:异步的方法在处理完成之前就返回到调用方法,C#的async/await特性可以创建并使…

async/awiat和promise之间的区别

今天看到了一段代码 async function async1() {console.log(async1 start);await async2();console.log(async1 end); } async function async2() {console.log(async2); } console.log(script start); setTimeout(function() {console.log(setTimeout); }, 0) async1(); new …

什么是异步

文章目录 前言一、异步是什么?二、举个例子来理解异步 1.异步最典型的例子就是“回调函数”总结 前言 在vue的过程中,我们一定会遇到诸如: function(参数).then(res>{}) 形式的代码。到底怎么编译执行的呢 &#x…

Spring Boot 基础学习之(五)页面通过自定义LocaleResolver组件实现网页页面的的中英文转换

本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在前端网页,是不是看见过这样的功能 基础网页:中文表示 点击下面的English 按钮网页显示文字开始切换 通过功能性按钮实现中英文切换,在浏览器中,都带着一个功能叫翻…

网页中文转英文(国际化)

背景: 我的项目是已经完成的项目,因为要拓展海外市场,需要支持英文。 采用的方式是添加配置文件,见下文详细步骤。 本文基本转自:http://blog.csdn.net/wuhawang/article/details/52228589 在他的基础上给大家一点提示…

英语数字转换器

英语数字转换器 STL中map,stack和string的运用 描述: 在这个问题中,将用英语给你一个或多个整数。你的任务是将这些数字转换成整型表示。数字范围从-999,999,999到999,999,999.下面是你的程序必须考虑的详尽的英语单词表: neg…

Unity 中英文转换

在Resources下创建文件夹LanguageTxt,再其创建“Chinese.txt”及“English.txt”(记得保存文本时选择UTF-8) Chinese.txt Btn:这是一个按钮 English.txt Btn:This is a button 在Scripts下创建“LanguageManager.cs”及“UIText.cs” L…

SAP中英文转换--中文转英文

中文转英文-函数:CONVERSION_EXIT_CUNIT_INPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_INPUT’ EXPORTING input “输入的中文单位 IMPORTING output “输出的英文单位 效果图:

SAP 中英文转换-英转中

英文转中文-函数:CONVERSION_EXIT_CUNIT_OUTPUT CALL FUNCTION ‘CONVERSION_EXIT_CUNIT_OUTPUT’ EXPORTING input “输入的英文单位 IMPORTING output “输出的中文单位

将数字转换为中文

功能需求 做公司项目遇到一个有关交易金额(合同签订书)的内容,需要将查询出来的交易金额转化为中文数字,例如:壹拾捌万伍仟元整(185000.00) 需求分析 因为合同书中的数据都是动态的&#xff0c…

Java 16进制报文转换中英文报文(通过字节转换)

最近在搞这个16进制报文,网上找了很多地方,解出来的结果不是乱码就是报错,干脆自己写了。 大概是这样的,16进制的报文大家都知道是什么样子 例如: 3C E4 BA A4 E6 98 93 E6 88 90 E5 8A 9F EF BC 81 3E 20 3C 42 61 6B 31 2F 3E 因为其中包…

通过C#进行中英文转换

通过C#进行中英文转换 编写相应语言的XML文件&#xff0c;添加xml文件 ChineseSimplified.xml文件内容 <?xml version"1.0" encoding"GB2312" ?> <Softimite Language"12"><Form><Name>LoginForm</Name><…

【Adobe After Effects中英文转换2019——2023版】

** Adobe After Effects中英文转换2019——2023版 ** 如果是默认安装的软件&#xff0c;在桌面右击AE图标&#xff0c;点击打开文件所在位置&#xff0c;来到软件安装目录 C:\Program Files\Adobe\Adobe After Effects 2023\Support Files 找到AMT文件夹 点击进入&#xf…

在线中英文符号转换工具

在线中英文符号转换工具 在线中英文符号转换工具 将中文符号转换成英文符号或将英文符号转换成中文符号&#xff0c; 将单引号‘’都转换成’&#xff0c; 将双引号“”都转换成" 将中括号【】转换成[]&#xff0c; 将大括号&#xff5b;&#xff5d;转换成{} 将逗号&…

英文表格如何快速转换为中文?

今天跟大家分享一下英文表格如何快速转换为中文&#xff1f; 1.首先打开Excel文件&#xff0c;选中要翻译的单元格&#xff0c;点击【DIY工具箱】 ​ 2.点击【翻译】 3.选择【有道翻译】 4.将翻译语言设置为中文&#xff0c;然后点击【确定】 5.鼠标点击一个合适的单元格作为翻…

英文转换-在线英文批量转换器免费

英文转换&#xff0c;怎么找到好的英文转换器&#xff1f;今天给大家分享一款免费批量的英文转换器汇集了世界最好的几个翻译平台&#xff08;百度/谷歌/有道&#xff09;&#xff0c;为什么这么多人使用它&#xff1f;首先第一点翻译质量高&#xff0c;选择性多。第二点可以批…

php 英文转中文,中文转换成英文

[php]代码库/** * 中文转换成英文 */ function pinyin($_String, $_Codegb2312){ $_DataKey "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha". "|chai|chan|chang|chao|che|chen|cheng|c…

C#小知识之中英文转换、去空格

一、中英文转换 1、安装NPinYin 2、编写代码 string str "这里是测试的中文字符串"; string str1 Pinyin.GetChineseText(str); string str2 Pinyin.GetInitials(str); string str3 Pinyin.GetPinyin(str);Console.WriteLine("取和拼音相同的汉字列表&…

Qt 语言家实现中英文切换(解决纯代码添加部件的中英文转换问题)

Qt 语言家实现中英文切换&#xff08;解决纯代码添加部件的中英文转换问题&#xff09; 关于.ts和.qm文件的生成&#xff0c;更新翻译、发布翻译等步骤就不多说了&#xff0c;其他博主有大量的描述。 现在我要解决的是中英文未完全转换的问题如下图&#xff1a; 如上图所示&a…