Javascript模拟多线程
2012-12-05 09:32
369 查看
副标题: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
(学习心得,不敢独享,欢迎指正)
两个问题:
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
相关文章推荐
- 用fason的参数化定时器在javascript中模拟多线程
- 在Javascript中用command模式模拟多线程,包含注释
- 关于使用Javascript来模拟多线程的一点想法
- 在Javascript中用command模式模拟多线程,包含注释
- Javascript模拟多线程
- JavaScript用Command模式模拟多线程
- 用javascript模拟多线程
- JavaScript用Command模式模拟多线程
- 在javascript中用command模式模拟多线程
- 多线程模拟客户端并发
- 在IE8下,用javascript的ActiveX,通过模拟键盘操控填写file input
- 利用curl 模拟多线程
- 如何抓取AJAX Javascript模拟的超链接
- JavaScript的多线程(工作线程)简介
- 利用IE对多帧GIF的onload事件重复执行的原理实现(JavaScript多线程的实现)
- 编写多线程程序,模拟多个人通过一个山洞。这个山洞每次只能通过一个人,每个人通过山洞的时间为2秒(sleep)。随机生成10个人,都要通过此山洞,用随机值对应的字符串表示人名,打印输出每次
- javascript模拟select,jselect的方法实现
- Javascript模拟加速运动与减速运动代码分享
- JavaScript可否多线程? 深入理解JavaScript定时机制
- JavaScript模拟下拉菜单代码