Javascript模拟多线程

http://www.cnblogs.com/fumj/archive/2012/12/05/2802479.html

两个问题:
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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值