理解 Javascript 的单线程,着实不易

理解 Javascript 的单线程,着实不易。

比如,对于 C 系编程来说,写个 while(true) 不是什么令人紧张的事情。在 nodejs 中似乎也不会出什么意外,因为还有消息机制可以操控——这只是你对 nodejs 的幻觉,或者说,这只是我对 nodejs 的幻觉。若子进程写成这样的话:

process.on('message', function() {
  while(true);
});

process.on('SIGINT', function() {
  console.log('Child Process killed by SIGINT Signal .');
  process.exit();
});

process.on('SIGTERM', function() {
  console.log('Child Process killed by SIGTERM Signal .');
  process.exit();
});

当主进程发出 kill 时会发生什么?在我的 MAC 上,子进程失控,CPU 跑满,风扇狂转。

因为在 nodejs 中,一个 while(true) 让 eventloop 直接卡死了。

对于 Javascript 来说,应用 setInterval 的。记得之前是有人提醒过我,要会用 setInterval,从坑里爬出来才深刻体会到,是该会用的。

所以说,在 Javascript 中,应该禁用 while 做轮循或等待。

--------------------------------

在 nodejs 中,“线程”的概念就这么几种实现,process.nextTick、setTimeout、setImmediate、setInterval,异步编程也靠这些。但它们都不是真正的“线程”,比如做不到 sleep(),做不到精准定时,总归,其实仍然是一根线程,进程下的就这么一根线程。如果有需要掐时间调度的工作,或者比较重型的耗时工作,还是得开子进程来得差不多。

--------------------------------

在 nodejs 中似乎不会存在“临界区”这么个概念以及其带来的问题。因为丫根本就不允许进程间共享资源。公有数据只能写在第三方服务里。静态配置还好说,写在一个模块中就完了。动态配置和动态信息的话……最简单的就是……读写文件……如果不频繁的话倒不是什么问题。频繁的话,就得上重型装备,比如 redis ……

--------------------------------

拿 Javascript 做到现在,算是慢慢体会到这门语言应有的思维,或者说,语言,其在图灵机中的运行策略。当我面试别人问及语言时,真正会用者,所言及之事,不是说它都做什么,而是,它有什么什么,不能。知其不可者,才是经验。

时间: 2024-08-07 05:33:41

理解 Javascript 的单线程,着实不易的相关文章

深入理解Javascript单线程谈Event Loop

假如面试回答js的运行机制时,你可能说出这么一段话:"Javascript的事件分同步任务和异步任务,遇到同步任务就放在执行栈中执行,而碰到异步任务就放到任务队列之中,等到执行栈执行完毕之后再去执行任务队列之中的事件."但你能说出背后的原因吗? 1.线程与进程 进程:是系统资源分配和调度的单元.一个运行着的程序就对应了一个进程.一个进程包括了运行中的程序和程序所使用到的内存和系统资源. 线程:线程是进程下的执行者,一个进程至少会开启一个线程(主线程),也可以开启多个线程. 2.同步和异

我想这次我真的理解了 JavaScript 的单线程机制

今天面试的时候被问到一个问题,是关于 JS 异步的.当时我脑海中闪过了一个单线程的概念,但却没有把真正的原理阐述清楚.所以回来特意重新回顾了前面单线程和异步相关的一些知识点. 虽然之前学习的时候也接触了单线程模型相关的东西,但当时理解得并不是很清楚和明白.所以这道面试题也没有给出一语中的的答案.重新阅读阮一峰的 <JavaScript 运行机制详解>和我之前写的<setTimeout 异步与回调>之后.我决定重新写一篇博客来更加白话的总结 JS 的单线程机制和异步. 重演历史 -

Javascript引擎单线程机制及setTimeout执行原理说明

setTimeout用法在实际项目中还是会时常遇到.比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM,如果再这个函数堆栈中把页面背景先从白色设为红色,再设回白色,那么浏览器会认为DOM没有发生任何改变而忽略这两句话,因此我们可以通过setTimeout把“设回白色”函数加入下一个堆栈,那么就可以确保背景颜色发生过改变了(虽然速度很快可能无法被察觉). 总之,setTimeout增加了Javascript函数调用的灵活性,为函数执行顺序的调度提供极大便利. 然后,我们从基础的层面来看看:理解J

Javascript是单线程的深入分析(转)

原文: http://blog.csdn.net/talking12391239/article/details/21168489 Javascript是单线程的 因为JS运行在浏览器中,是单线程的,每个window一个JS线程,既然是单线程的,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码.而浏览器是事件驱动的(Event driven),浏览器中很多行为是异步(Asynchronized)的,会创建事件并放入执行队列中.javascript引擎是单线程处理它的任务队列,你可以理解

[转]Javascript是单线程的深入分析

Javascript是单线程的深入分析 面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚.来深入分析一下: 首先看下面的代码: function foo() { console.log( 'first' ); setTimeout( ( function(){ console.log( 'second' ); } ), 5);

Javascript是单线程的深入分析

本来想总结一下的,网上却发现有人已经解释的很清楚了,特转过来. 这也解释了为什么在用自动化测试工具来运行dumrendtree时设定的超时和测试case设定的超时的关联性. 面试的时候发现99%的童鞋不理解为什么JavaScript是单线程的却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念很不清楚.来深入分析一下: 首先看下面的代码: 1 2 3 4 5 6 7 8 9 function foo()

关于javascript的单线程和异步的一些问题

关于js单线程和异步方面突然就糊涂了,看别人的文章越看越糊涂,感觉这方面是个坑,跳进去就不好跳出来.再去看,看着看着感觉自己明白了一些东西,也不知道对不对,反正是暂时把自己说服了,这样理解能理解的通,就总结了一下几个问题. 问题1:浏览器的线程与进程 看了很多资料,很多人对进程和线程是不加区分的,甚至上面说的说进程下面就改口为线程了.按我的理解进程是比线程大的一个概念,当一个程序运行就开辟单个或多个进程地址空间(IE.Firefox.Safari均是单进程模式,Chrome则上多进程大),然后各

JavaScript 是单线程的而且是异步的机制

浏览器中的js程序是单线程的,那异步调用是怎么实现的呢?计时器是靠谁实现的呢?单线程难道是一边执行程序一边计时吗? 好了 ----之前就有好多的疑问  ,现在按我的理解和大家说一说 一.JavaScript单线程 在浏览器中,执行JS程序只有一个线程,所以是单线程,所以执行顺序就是从上到下依次执行,同一段时间内只能有一段代码被执行.你可能会问,为什么不用多线程呢,这样不是更能充分利用CPU吗? ps:只能说早期的页面非常简单,所以我认为设计者没有考虑多线程的问题 (本人猜想的哈,勿喷!!).另外

JavaScript可否多线程? 深入理解JavaScript定时机制

http://www.phpv.net/html/1700.html JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是Java