彻底理解异步编程!你理解了吗?

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

大家好,我是小风哥。

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

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

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

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

最后举一个例子。

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

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

好啦,这篇就到这里,希望对大家有所帮助。

责任编辑:武晓燕 来源: 码农的荒岛求生
相关推荐

2019-12-26 09:15:44

网络IOLinux

2024-02-02 09:00:14

内存泄漏对象

2022-10-20 18:43:32

C语言golang安全

2023-11-07 08:19:35

IO多路复用磁盘、

2021-03-19 07:59:33

红黑树面试数据

2022-05-03 00:03:11

状态管理前端开发

2023-09-07 08:15:58

场景同步异步

2012-11-30 11:19:02

JavaScript

2018-03-21 16:19:40

MVCMVPMVVM

2022-03-27 09:06:25

vuexActionsMutations

2019-09-16 08:32:59

递归算法编程

2020-04-16 10:55:03

Java虚拟机字节码

2019-09-18 10:12:37

递归数据结构

2020-06-29 08:32:21

高并发程序员流量

2023-01-12 11:23:11

Promise异步编程

2021-09-07 07:55:22

Linux CPULinux 系统

2009-05-18 10:57:35

.NETString特性

2021-05-13 08:55:33

Android架构功能

2016-10-21 11:04:07

JavaScript异步编程原理解析

2019-01-09 08:31:07

点赞
收藏

51CTO技术栈公众号