异步编程到底在说啥?

CSDN云计算 CSDN云计算     2023-01-31     630

关键词:


作者 | 码农的荒岛求生

来源 | 码农的荒岛求生

之前很多同学在微信上问能不能讲讲异步编程是怎么一回事儿,今天就和大家简单聊一聊这个话题。

我们以函数调用为例,假设有这样的代码:

void B() 
  lines = read(filename);
  sum(lines);



void A() 
  ...
  B();
  ...

代码非常简单,B函数读取一个文件,文件里保存的是一行行数据,然后加和,A函数中的某个位置调用B函数。

此时,我们说这是同步调用,因为A函数后续代码必须等待B函数处理完文件才能继续执行。

随着业务不断发展,B函数处理的文件越来越庞大,此时处理一次文件耗时2小时,假设A函数后还有一行重要的代码:

void A() 
  ...
  B();
  something_important();
  ...

这就意味着调用B函数后需要等待2个小时才能执行到something_important这行代码,而something_important函数对时间要求非常苛刻,该怎样改进呢?

其实很简单,我们可以在B函数内部创建一个线程,在线程中处理文件:

void handle_file() 
  lines = read(filename);
  sum(lines);



void B() 
  thread t(handle_file);



void A() 
  ...
  B();
  something_important();
  ...

这样B函数被调用后创建完线程即可立即返回,紧接着开始执行something_important这行代码,CPU在执行something_important这行代码时可能文件还没有开始处理,这样函数A不再依赖于文件处理,这时我们说函数B函数就是异步调用的,函数A异步于文件处理。

如果是在单核系统下,CPU会不断在处理文件线程和A函数线程间切换,看上去这两个线程就好像在同时运行,但如果是在多核系统下,这两个线程可以真正的并行起来。

在编程语境下,异步往往和线程进程等相关

最后举一个例子。

同步就好比你排队去自助售票机取电影票(话说小风哥已经很久很久没有去电影院看电影了),你必须排队等待前一个人取完电影票才能到你,你不能在前一个取票的过程中取自己的票,这时我们说取电影票时你和前一个人是同步的。

而异步就好比去吃大餐,你在座位上看菜单点菜,其它人也可以点菜,你不需要等待其它人吃完饭才能下单,这时我们说你点菜和其它人吃饭是异步的。

往期推荐

直接root Android设备,你知道吗?

我们到底需要什么样的低代码平台?

清华大学:2021元宇宙研究报告

Mendix 发布全球低代码报告

点分享

点收藏

点点赞

点在看

BitTorrent peer (Deluge) 在说啥?

】BitTorrentpeer(Deluge)在说啥?【英文标题】:WhatisBitTorrentpeer(Deluge)saying?BitTorrentpeer(Deluge)在说什么?【发布时间】:2018-06-1320:23:41【问题描述】:我正在编写一个小应用程序来测试torrentp2p的工作原理,我创建了一个示例torrent,并... 查看详情

终结器和析构器,***在说啥?

】终结器和析构器,***在说啥?【英文标题】:Finalizersanddestructors,what\'sWikipediasaying?终结器和析构器,***在说什么?【发布时间】:2011-08-1811:18:46【问题描述】:据我所知,关于这个问题有两个阵营-第一个认为终结器是C#特有的... 查看详情

当谈论设备指纹时,我们到底在说什么?(转)

原标题:当谈论设备指纹时,我们到底在说什么?http://finance.ifeng.com/a/20170829/15621402_0.shtml  中新网8月29日电 “设备”和“指纹”作为独立名词存在时,其具有非常典型的硬件属性;一旦将他们结合起来变成&ldq... 查看详情

面向对象六大原则,到底在说什么?

面向对象六大原则不一定需要死记硬背,只要知道为什么我们需要这六大原则就可以了。开发中总是有各种各样的架构问题,而六大原则有助于我们完成高扩展性、低耦合、高内聚的目标。单一职责制定流程,分工合... 查看详情

究竟什么是异步编程?

在我们的工作和学习当中,到处充满了异步的身影,到底什么是异步,什么是异步编程,为什么要用异步编程,以及经典的异步编程有哪些,在工作中的场景又有什么,我们一点点深入的去学习。  什么是异步编程?  有必... 查看详情

并发编程之io模型(代码片段)

...塞IO  四、多路复用 1??IO模型介绍  1何为同步、异步、阻塞和非阻塞    同步:     #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,其实绝大多数函数都... 查看详情

基本概念_同步异步有什么区别

1、同步、异步有什么区别在进行网络编程时,我们通常会看到同步、异步、阻塞、非阻塞四种调用方式以及他们的组合。其中同步方式、异步方式主要是由客户端(client)控制的,具体如下:同步(Sync)所谓同步,就是发出一... 查看详情

promise执行顺序

参考技术A在我们的工作和学习当中,到处充满了异步的身影,到底什么是异步,什么是异步编程,为什么要用异步编程,以及经典的异步编程有哪些,在工作中的场景又有什么,我们一点点深入的去学习。什么是异步编程?有... 查看详情

react中的setstate到底是同步还是异步?

参考技术AsetState是同步还是异步,不是绝对的,根据不同情况,是不一样的,如下:1、同步的情况  1)setState在setTimeout中是同步的。  2)setState在原生事件中是同步的,即通过dom绑定事件的方式实现。2、异步的情... 查看详情

并发系列64章(异步编程)第二章(代码片段)

前言异步编程的概念我在第一章概要的时候,提及了。在此再次简略概要一次。它采用future模式或者回调模式机制,以避免产生不必要的线程。异步编程测试的标准在第一个写这个的原因,是因为测试可能比开发重要。因为在开... 查看详情

并发系列64章(异步编程)第二章(代码片段)

前言异步编程的概念我在第一章概要的时候,提及了。在此再次简略概要一次。它采用future模式或者回调模式机制,以避免产生不必要的线程。异步编程测试的标准在第一个写这个的原因,是因为测试可能比开发重要。因为在开... 查看详情

都在说边缘计算,它到底是用来干啥的?

...都需要通过边缘计算实现业务部署“本地化”。边缘计算到底是做什么的,哪些业务和场景是刚需?本文从算力的演进、数据时代特征介绍边缘计算诞生的背景,然后分享边缘计算天然适配的业务模型及其主要形态&#x... 查看详情

c#c#5.0新特性——async和await使异步编程更简单

...—就是C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的。二、同步代码存在的问题 对于同... 查看详情

64bit到底是啥?操作系统和cpu都在说64bit,但我不了解这到底是啥。

我们通常说的64位技术是相对于32位而言的,这个位数指的是CPUGPRs(General-PurposeRegisters,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据。64位平台不管是在性能上,还是... 查看详情

mingw到底怎么读

因为意思是minimalistGNUforWindows所以是分开读:明机大不溜,mingw的开发者也是这么读的。不过这些都没有标准的发音,只要保证对方能理解你在说什么就好。参考技术ADexteritycomesbyexperience. 查看详情

现在大家都在说的云原生到底是啥?

云原生是一个组合词,可以拆分为“云”和“原生”两个词,“云”我们都知道,即在线网络,传统的应用原本都跑在本地服务器上,很有可能需要停机更新,且无法动态扩展,“云”表示应用程序运行在分布式的云环境中,可... 查看详情

面向对象六大原则,到底在说什么?

面向对象六大原则不一定需要死记硬背,只要知道为什么我们需要这六大原则就可以了。开发中总是有各种各样的架构问题,而六大原则有助于我们完成高扩展性、低耦合、高内聚的目标。单一职责制定流程,分工合... 查看详情

libevent到底是同步还是异步,是阻塞还是非阻塞

...sp;     应该从不同角度看libevent的同步/异步、阻塞/非阻塞:IO数量的角度:select出来之前,会阻塞在一个io上,处理完成后再阻塞在下一个io上;之后就是把所有的iofd拿过来,都不阻塞,一个一个fd去询问是否... 查看详情