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

生命有限,努力无限

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

相关文章:

你感兴趣的文章:

标签云: