Javascript模拟多线程

副标题:Javascript异步通信的实现原理与multi-node
(学习心得,不敢独享,欢迎指正)

两个问题:
1、Node编程中所有通信都是异步执行的,如果某个事件的响应函数需要操作全局变量,则多个回调同时运行时怎么实现同步?
2、群里里面的兄弟“老狗”发现了一个项目:multi-node,即使用可以用其编写多线程的网络服务。 但是node本来就是异步的,为什么还需要多线程?

解答:
首先说一下JS的执行原理:js引擎执行js代码的时候是单线程的,即同一时刻只会有一个进程执行JS代码,回调函数也是一个一个执行的(按照事件发生的顺序,而不是代码的顺序)。JS中的异步通信和定时是由另外的线程实现的,脱离js线程上下文。以JS定时操作举例,当JS引擎执行setTimeout(callbackFunction, 100)操作时,它会通知定时线程我需要100毫秒的定时,之后JS引擎进入事件循环。100毫秒之后,定时引擎向事件队列中加入一个时间已到的事件。JS引擎从队列中读取时间已到的事件,执行callbackFunction。 如果同一时间有多个事件加入事件队列,JS引擎也只会一个一个的执行callback。对于异步也是同样,JS代码发起通信请求,通信线程执行通信操作,并在操作完成后将完成事件加入事件队列。JS引擎从队列中取出事件并调用回调处理通信结果。JS引擎在执行回调函数的时候,不能同时响应其他事件。


JS引擎示意图

如上所述,第一个问题迎刃而解,单线程自然就不必考虑同步问题了。对于Node应用而言,它是部分多线程,即非阻塞IO为多线程,但是IO结果的处理还是单线程执行。所以在IO结果处理比较复杂占用很多时间的时候,还是有必要启动多个node线程来响应请求的。不过话又说回来,像node这种编程模型的优点就是可以使用简单的代码写出高性能的应用,如果使用多个node线程,则处理它们之间的数据交换和同步就会大大增加应用编写的复杂程度,是否得不偿失就需要认真斟酌了。

相关资料:
浏览器中JS执行原理的说明:http://www.phpv.net/html/1700.html
浏览器伪多线程库:http://www.infoq.com/cn/articles/js_multithread

posted @ 2012-12-05 09:32  ``炯``  阅读(3297)  评论(0编辑  收藏  举报