关键词:
作者 | 码农的荒岛求生
来源 | 码农的荒岛求生
之前很多同学在微信上问能不能讲讲异步编程是怎么一回事儿,今天就和大家简单聊一聊这个话题。
我们以函数调用为例,假设有这样的代码:
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函数线程间切换,看上去这两个线程就好像在同时运行,但如果是在多核系统下,这两个线程可以真正的并行起来。
在编程语境下,异步往往和线程进程等相关。
最后举一个例子。
同步就好比你排队去自助售票机取电影票(话说小风哥已经很久很久没有去电影院看电影了),你必须排队等待前一个人取完电影票才能到你,你不能在前一个取票的过程中取自己的票,这时我们说取电影票时你和前一个人是同步的。
而异步就好比去吃大餐,你在座位上看菜单点菜,其它人也可以点菜,你不需要等待其它人吃完饭才能下单,这时我们说你点菜和其它人吃饭是异步的。
往期推荐
点分享
点收藏
点点赞
点在看
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模式或者回调模式机制,以避免产生不必要的线程。异步编程测试的标准在第一个写这个的原因,是因为测试可能比开发重要。因为在开... 查看详情
都在说边缘计算,它到底是用来干啥的?
...都需要通过边缘计算实现业务部署“本地化”。边缘计算到底是做什么的,哪些业务和场景是刚需?本文从算力的演进、数据时代特征介绍边缘计算诞生的背景,然后分享边缘计算天然适配的业务模型及其主要形态... 查看详情
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去询问是否... 查看详情