“单线程/多线程”与“同步/异步”还有“阻塞/非阻塞”
发布日期:2021-05-07 10:15:38 浏览次数:26 分类:精选文章

本文共 1467 字,大约阅读时间需要 4 分钟。

最近在学习node.js的时候遇到了三对看起来有点让人摸不着头脑的词语——“单线程”、“多线程”、“同步”、“异步”、“阻塞”、“非阻塞”。倘若现在给你一秒钟,让你快速地在脑海里过一遍上面六个词语,估计很少有人会把它们的含义和区别理的特别清楚。下面是根据我收集到的资料加上自己的总结得出的一些结论。

1.同步与异步
同步与异步可以理解为一种“行为方式”。
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,但没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态来通知调用者,或通过回调函数处理这个调用。调用者不用等待这个调用的结果。比如说ajax请求,在请求发送之后,代码就会执行ajax请求之后的代码,我们可以通过查看http状态码、ajax状态值来查看请求执行情况,也可以在结果返回之后通过回调函数中的suceess、error等方法来处理结果。
打个比方,你去淘宝买东西,询问客服某个宝贝怎么怎么样,同步就是坐着等待客服回复,不干其他的事情,除非客服回答了你。异步则是可以先干别的事情,等客服给你发消息之后才回去继续和客服聊。

2.单线程与多线程

在了解单线程与多线程之前,我们要明白什么是“进程”。当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由一个或多个线程所组成的。
那线“线程”又是什么东东呢?线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等)。线程可以理解为进程中的执行的一段程序片段。举个栗子——某音频播放程序可以实现一边在显示歌词、一边在显示音频柱、一边在放歌。这就是一个程序下面有多个线程。
在单个程序中同时运行多个线程完成不同的工作,称为多线程,反之为单线程。

3.阻塞与非阻塞

阻塞与非阻塞可以理解为“等待状态”。
阻塞就是在调用结果返回之前,线程一直在等待结果。
非阻塞则是在不能立刻得到结果之前,线程不会一直等待结果。
还是以逛淘宝为例,在等待客服回复时,阻塞相当于你的精力一直放在与客服聊天的页面上,客服不回复爷爷就不走了。非阻塞就相当于你还是有一部分精力放在与客服聊天的页面上,不过同时你也可以干其他的事情(注意是可以,你也可以不干其他任何事,就坐在那里发呆)

阻塞与非阻塞与是否同步异步无关。就上面淘宝的例子——同步阻塞:等待客服的同时,不干任何事情,也就是说你坐在电脑面前发呆、浪费时间;同步非阻塞:先做一会儿其他的事情,再回头看客服有没有回复,没有的话再做一会儿其他的事情在回来看;异步阻塞:在客服回复之前,你明明可以离开聊天页面去干别的事情,但你丫非要等客服回复,相当于在异步等待。异步非阻塞:在客服回复之前,离开聊天页面去干别的事情,直到客服回复你才回去继续聊天。

从原理上讲异步也是可以有阻塞和非阻塞的,但实际上对异步讨论阻塞、非阻塞意义不大,一般阻塞和非阻塞是针对同步的。

在这篇博客之前的版本中(就在我写这个版本的5个小时前发布的),我对阻塞、非阻塞的理解还不是很深,所以在阻塞/非阻塞这块写错了一些东西,现在根据我最新的理解又重新写了一遍。

以上就是我对“单线程”、“多线程”、“异步”、“同步”、“阻塞”和“非阻塞”的一些理解。如果诸位对此有不同见解,欢迎写到下方评论区中与我们一起分享。

上一篇:Promise浅析(一)——基础篇
下一篇:函数构造法不同类方法相同出现的问题

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月19日 18时36分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章