JS的单线程
JS语言的特点之一就是单线程,简而言之就是同一时间只能做一件事,假设JS是多线程,一个线程在某个节点上添加内容,另一个线程删除了这个节点,这时就看到了问题所在了,但是H5提出了Web Worker标准,允许js脚本创建多个线程,但是子线程完全受主线程的控制,而且你不得操作DOM,所以本质上并没有改变他单线程的本质。
这时让我们想另一个情景,有两个任务,第一个任务是ajax的请求第二个任务是操作DOM,那么第二个任务就必须等到ajax任务请求完成,但是这个任务是IO设备(输入输出设备)他非常的慢,这就使CPU闲着了,这时我们就引出了同步任务,异步任务,同步任务指在主线程上排队执行的任务只有上一个任务完成了下一个任务才执行,而异步任务指,不进入主线程,而进入‘’任务队列‘’,只有任务队列通知了主线程某个异步任务可以执行了,该任务才可以进入主进程执行    
异步执行的运行机制如下
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。

主线程和任务队列的示意图如下
任务队列就是一个事件的队列,IO设备完成一项任务就向任务队列中添加一个事件,表示相关的异步任务可以进入执行栈了,主线程读取任务队列,就是读取里面有哪些事件。
任务队列中事件有:ajax异步请求,定时器,一些事件如点击事件、滚动事件等等,只要指定了回调函数,这些事件就会进入任务队列,等待主线程的读取
那么回调函数是啥呢?他就是被主线程挂起的代码,异步的任务必须指定回调函数,主线程开始执行任务队列的任务,其实就是执行回调函数
你可能会经常听到这个单词  Event Loop  他翻译过来就是 事件循环,也就是说,主线程从任务队列中读取事件,这个过程是循环不断的
主线程运行的时候,会产生堆(heap)和栈(stack),栈中的代码调用各种外部的API( Application Programming Interface) 他们会在任务队列中加入各种事件,只要栈中的代码执行完毕,主线程就会去读取任务队列,依次执行那些事件所对应的回调。
 
Node.js的单线程
Node.js也是单线程的,但是他的运行机制不同于浏览器
他的机制如下
(1)V8引擎解析JavaScript脚本。
(2)解析后的代码,调用Node API。
(3)libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎。
(4)V8引擎再将结果返回给用户。

Node.js除了setTimeout和setInterval这两个方法又新增了两个与任务队列有关的方法,process.nextTick和setImmediate
process.nextTick 在下一次Event Loop(主线程读取任务之前)--触发回调函数,就是他在所有异步函数之前调用
process.nextTick(function A() {console.log(1);process.nextTick(function B(){console.log(2);});
});setTimeout(function timeout() {console.log('TIMEOUT FIRED');
}, 0)
// 1
// 2
// TIMEOUT FIRED

  

setImmediate则是在当前任务队列的尾部添加事件,也就是说,它指定的任务总在下一次的Event Loop时执行  
setImmediate(function (){setImmediate(function A() {console.log(1);setImmediate(function B(){console.log(2);});});setTimeout(function timeout() {console.log('TIMEOUT FIRED');}, 0);});
// 1
// TIMEOUT FIRED
// 2

  

因为A和延时器是在同一轮的Loop执行,而函数B在下一轮Loop执行

由此可见,他俩一个区别是,process.nextTick 语句总是在当前执行栈一次执行完,多个setImmediate可能需要多次loop才能执行完

转载于:https://www.cnblogs.com/zhangjixiang123/p/10093716.html

简谈单线程多线程的理解相关推荐

  1. 同步异步单线程多线程初级理解

    对于我开始接触同步异步单线程多线程的概念的时候,都是分别理解同步和异步.单线程和多线程概念,当看到"使用同步方法保证线程安全"时愚昧的理解为那就是单线程咯:于是就陷入了困惑,同步等 ...

  2. java 线程的理解_浅谈对多线程的理解(一)

    今天我们先来聊聊有关线程的话题...... 一. 线程概述 1. 简单区分程序.进程和线程 程序是指一段静态的代码 进程是指正在执行的程序,将静态的代码运行起来 线程是指正在执行程序的小单元 举个栗子 ...

  3. php谈谈你对分布式的理解,简谈关于对分布式处理的理解

    原标题:简谈关于对分布式处理的理解 最近这段时间一直在看分布式有关的东西,但是关于分布式自己还是不能很好的理解,所以本文对分布式基础概念进行下学习. 分布式处理 首先先了解一下分布式处理,分布式处理和 ...

  4. .NET简谈事务、分布式事务处理

    在本人的 " .NET简谈事务本质论"一文中我们从整体上了解了事务模型,在我们脑子里能有一个全局的事务处理结构,消除对数据库事务的依赖理解,重新认识事务编程模型. 今天这篇文章我们 ...

  5. 浅谈Java多线程机制

    浅谈Java多线程机制 (-----文中重点信息将用红色字体凸显-----) 一.话题导入 在开始简述Java多线程机制之前,我不得不吐槽一下我国糟糕的IT界技术分享氛围和不给力的互联网技术解答深度. ...

  6. .NET简谈网络系统大局观

    我们都知道软件发展经历了很长一段路程,在软件刚刚起步的时候,有一批世界顶尖的科学家用自己整个的人生为我们创造了今天美好的信息世界,我印象最深的是我看过一本书,书名是<优雅人生>是专门介绍一 ...

  7. 关于Python多线程的理解

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  8. 异步复位同步释放_简谈同步复位和异步复位

    简谈同步复位和异步复位 大侠们,江湖偌大,有缘相见,欢迎一叙,今天来聊一聊数字电路设计中的同步复位和异步复位. 谈到同步复位和异步复位,那咱们就不得不来聊一聊复位这个词了.在数字逻辑电路设计中,电路通 ...

  9. .NET简谈组件程序设计之(上下文与同步域)

    我们继续学习.NET多线程技术,这篇文章的内容可能有点复杂.在打破常理之后,换一种新的思考模型最为头疼.这篇文章里面会涉及到一些不太常见的概念,比如:上下文.同步域等等.我也是最近才接触这些关于组件编 ...

最新文章

  1. linux操作系统应急方案,服务器操作系统应急预案
  2. oracle自动售票服务器,一种基于Oracle数据库客户端的业务自动处理方法与流程
  3. Ubuntu16.04 python2.7升级python3.5
  4. 【转】tftp命令详解
  5. 对pca降维后的手写体数字图片数据分类_知识干货-机器学习-TSNE数据降维
  6. 开发人员一定要加入收藏夹的网站(引用)
  7. 小汤学编程之JavaEE学习day04——EL表达式、JSTL
  8. 一大批历史精彩文章啦
  9. Mybatis3.5.4官网下载
  10. 音视频开发系列(10):基于qt的音频推流
  11. 四季芬芳,花开不只在春天
  12. python打印乘法口诀表
  13. 银行卡系统(面向对象进阶习题)
  14. 非负数的正则表达式匹配
  15. prettier和beautify哪个好用
  16. javascript 获取邮箱的后缀
  17. DolphinDB Database丨交易回测系列一:技术信号回测
  18. Bit Twiddling Hacks
  19. Android 尺寸转换器(适配各种屏幕)
  20. 国科大学习资料--最优化计算方法(王晓)--期末考试试卷1

热门文章

  1. cocos2dx android运行Luac编译后的lua代码
  2. 【每日Scrum】第三天(4.24) TD学生助手Sprint2站立会议
  3. 采访前高级软件工程课程学员付浩同学,及Scrum总结阅读感想
  4. Flex及AIR开发资源集合
  5. 《设计模式详解》手写简单的 Spring 框架
  6. 《设计模式详解》结构型模式 - 组合模式
  7. 【matplotlib笔记】3D图像绘制
  8. MD5工具类 加盐加密 及编码
  9. 凭什么它能成为报表神器?这五大技术硬货不得不服
  10. 锂电池接线方法图_锂电池制浆工艺(2)——制浆设备种类及特征