异步编程到底在说啥?(代码片段)

程序员大咖 程序员大咖     2023-02-02     417

关键词:

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

作者丨码农的荒岛求生

来源丨码农的荒岛求生(ID:escape-it)

大家好,我是小风哥。

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

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

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函数线程间切换,看上去这两个线程就好像在同时运行,但如果是在多核系统下,这两个线程可以真正的并行起来。

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

最后举一个例子。

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

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

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

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#特有的... 查看详情

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

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

redux异步编程redux异步编程(代码片段)

下载redux插件(异步中间件)npminstall--saveredux-thunkredux/store.js/*redux最核心的管理对象store*/importcreateStore,applyMiddlewarefrom‘redux‘importthunkfrom‘redux-thunk‘importreducerfrom‘./reducer‘exportdefaultcreate 查看详情

markdownjs异步编程(代码片段)

查看详情

completablefuture异步编排(开启异步编程代码示例)(代码片段)

目录一、开启异步编程2.1、runAsync:无入参、无返回值2.2、supplyAsync:无入参,可以获取返回值一、开启异步编程2.1、runAsync:无入参、无返回值源码示例代码packagecom.xz.thread.day1;importjava.util.concurrent.*;/***@description:开启异... 查看详情

node-异步编程(代码片段)

文章目录Node.js异步编程同步API和异步API回调函数代码执行顺序分析Node.js中的异步APIPromise异步函数Node.js异步编程同步API和异步API//路径拼接constpublic=path.join(__dirname,'public');//请求地址解析consturlObj=url.parse(req.url);//读取... 查看详情

异步编程模型(代码片段)

异步编程模型使用IAsyncResult设计模式的异步操作是通过名为BeginOperationName和EndOperationName的两个方法来实现的,这两个方法分别开始和结束异步操作OperationName。例如,FileStream类提供BeginRead和EndRead方法来从文件异步读取字节。这... 查看详情

dart异步编程之future(代码片段)

Dart异步编程包含两部分:Future和Stream本文将详细介绍FutureDart异步编程-future异步编程:FuturesDart是一个单线程编程语言。如果任何代码阻塞线程执行都会导致程序卡死。异步编程防止出现阻塞操作。Dart使用Future对象表示... 查看详情

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

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

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

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

异步编程理解异步(代码片段)

目录:  1、同步与异步  2、JavaScript单线程  3、定时器     定时器的执行过程     定时器可能存在的问题    定时器的应用场景    定时器的应用 同步与异步一段同步代码:1<script>2//te... 查看详情

基于任务的异步编程(代码片段)

基于任务的异步编程基于任务的异步模式(TAP)是基于System.Threading.Tasks命名空间中的System.Threading.Tasks.Task<TResult>和System.Threading.Tasks.Task类型,这些类型用于表示任意异步操作。TAP是用于新开发的建议的异步设计模式。命名、参... 查看详情

七:初探异步编程(代码片段)

同步编程创建类usingSystem;usingSystem.Diagnostics;namespaceTestAsyncConsolepublicclassNormalClassStopwatchsw=newStopwatch();publicvoidDoSomething()constintlargeNumber=600000;sw.Start();intt1=CountChar(1,l 查看详情

异步编程模型(代码片段)

classProgramstaticvoidMain(string[]args)varfunc=newFunc<string,string>(i=>returni+"icanfly";);varstate=func.BeginInvoke("yes,",Callback,func);Console.Read();staticvoidCallback(IAsyncResu 查看详情

异步编程之async和await(代码片段)

继续Dart异步编程的第五篇async和await。async和await是Dart异步编程用于简化异步API操作的两个关键字。它的作用就是能够将异步的代码使用同步的代码结构实现。相信学习过之前的Future和Stream的文章就知道,对于最终返回的值或者... 查看详情

angular--异步编程(代码片段)

1.异步编程目前常见的异步编程的几种方法:1、回调函数2、Promise3、Rxjs1.1准备工作创建一个asynDemo的项目ngnewasynDemo;创建一个obtain的服务,并且再app.moudle文件中引入和声明nggserviceservices/obtain创建一个home组件,并且再a... 查看详情

异步编程代码记录(代码片段)

1#region每个思考时间完成以后发送指定的数据量,不管服务器是否处理完23for(inti=0;i<_threadNumber;i++)45Task.Factory.StartNew(newAction<object>(t=>67PrintLog($@"ThreadId:Thread.CurrentThread.ManagedThreadId,StartingP 查看详情