所有的IO都是同步/阻塞调用的
nodejs吧
全部回复
仅看楼主
level 8
node.js 口号是 event driven I/O
单线程
注意这个单线程是指js执行在单线程中,所有的IO都是阻塞的,node的异步是因为后面有线程池帮它撑着。线程池做IO工作,所以Js那个线程不会阻塞。
所以node只是高并发,用户等待的时间不会减少,甚至更多,切换上下文也需要时间啊!
2014年05月27日 13点05分 1
level 8
感觉那个像是一群人在做传销是的,从不说node真正是什么,看了好几本书都说node单线程,单线程。。。那我就纳闷了,单线程,做的事情不会减少,凭什么就能处理那么多请求。。。这些书就没告诉我是线程池干的事,隐藏真实的东西。。。哼
2014年05月27日 14点05分 2
level 8
深入浅出node.js 国内写的书,说的很明白,感觉比国外的那三本(in Action/Apress的pro node/wrox的professional)E文书要好。好好看这本,就这样吧!
2014年05月27日 14点05分 3
level 9
ID很叼
2014年05月28日 13点05分 4
[胜利]
2014年05月29日 10点05分
level 11
单个用户等待时间确实更多
不过并发高的话,多个用户等待时间就会明显少了。。。
2014年05月30日 06点05分 5
如有错误请指正,谢 并发高的情况下相较于其他非事件驱动的框架,只是能够不阻塞接受request,但是都是IO的话,也是线程池,也有并发限制.减少的只是一次request的waiting时间,就是chrome在network那一栏一个request的timing,不明白你说的『不过并发高的话,多个用户等待时间就会明显少了』这个是什么意思
2014年05月30日 07点05分
咋回事,回复还限字数。。。
2014年05月30日 07点05分
回复 此ID已被我抢注 :我也不知道怎么描述好,感觉就像并行和串行执行那样,纯属个人猜测 [咦]
2014年05月30日 08点05分
回复 此ID已被我抢注 :其实快的话还是主要归功于v8
2014年05月30日 08点05分
level 10
node的异步实现顶层肯定也是多线程,但是我觉得node的优点是能更好的利用cpu以及编码简单灵活。
2014年05月30日 08点05分 6
level 7
如果别的线程都不用,那不是忒浪费了点?
2014年05月31日 05点05分 7
说对了,就是这么浪费,所以被既能多线程又是无阻塞异步的完爆。
2014年06月07日 12点06分
level 3
不要误导别人好吗 nodejs用中断的机制 不需要线程池 线程池那是PHP
2014年05月31日 10点05分 8
那你说IO是谁做的!!!再去学学...
2014年05月31日 12点05分
什么叫中断机制!!!只能呵呵了!!!那叫事件循环event loop , node执行js的部分单线程,在执行异步的时候,例如IO , 是在一个发出一个IO任务,进线程池排队后,立即返回,不阻塞执行js,在完成IO后,归还线程,执行回调...貌似说这些你还是会说不需要线程池blabla...呵呵
2014年05月31日 12点05分
IOCP,是基于消息机制通知回来的,所以无线程等待,r0里面不允许线程等待,了解下那个就知道了。
2014年06月07日 12点06分
回复 此ID已被我抢注 :event难道不是中断来实现吗?网卡接收消息 磁盘io要不要中断? 正因为有中断所以才可以异步!io发出给操作系统了要线程干什么?执行完了直接发个信号中断把事件排队起来就完事了,要什么线程?有必要吗 10万个并发连接,不多吧 你要开多少个线程?呵呵!少年谦虚点吧 你要学得太多了!!
2014年06月16日 18点06分
level 1
不懂不要胡说.
[蛋糕]
我用解释性的代码举个例子:
请求..
要菜单列表
得到菜单列表
响应,发送菜单列表
[茶杯] 同时来了30个请求,同步最大并发3个。
我们来比较下同步和异步的实现方式:
同步:
进程1 -> 请求 -> 要菜单列表 -> 得到菜单列表 -> 响应,发送菜单列表
进程2 -> 请求 -> 要菜单列表 -> 得到菜单列表 -> 响应,发送菜单列表
进程3 -> 请求 -> 要菜单列表 -> 得到菜单列表 -> 响应,发送菜单列表
4,5,6,...等待前3个完成
异步:
进程1 -> 请求 -> 要菜单列表 -> 交给操作系统
------------> 请求 -> 要菜单列表 -> 交给操作系统
------------> 请求 -> 要菜单列表 -> 交给操作系统
... ............继续接受请求
------------> 得到菜单列表 -> 响应,发送菜单列表
------------> 得到菜单列表 -> 响应,发送菜单列表
------------> 得到菜单列表 -> 响应,发送菜单列表
................得到菜单列表 -> 响应,发送菜单列表
看出区别了吗? 我只开了一个进程,处理了3个请求。
如果一个进程消耗10M内存,那么节省了20M内存。
同步的时候,一旦3个进程填满,后面的都要等待。
异步的时候,并没有等待,NODEJS继续处理请求,然后把IO交给操作系统。
操作系统取出数据,回调,NODEJS发送响应。
2014年06月07日 15点06分 9
哥,我说的就是实际IO操作,你的这个交给操作系统,操作系统不就是线程池同步IO完成回调通知。上面有人提到IOCP,是win系统特性,linux是libuv实现线程池,IOCP不允许同步等待(看上面说的),也就是回调通知,归根结底,做IO操作的那个家伙必须是同步的,它做完通知啊回调
2014年06月08日 00点06分
回复 此ID已被我抢注 : 你这明显不懂编程原理嘛! 你以为什么线程IO是语言来做的? c语言写了UNIX,留下SOKET API让程序员通过UNIX来驱动硬件。 没有操作系统,拿什么跟网线网卡光纤的传送报文? 你写的代码不过是对操作系统API的再封装, 层层深入后都是交给操作系统来处理,不管是多牛B的语言!
2014年06月08日 04点06分
回复 此ID已被我抢注 : 操作系统负责驱动电气标准的硬件,除非你针对电气标准手册,写一个二进制的硬件交互系统。 操作系统是支持并发的, nodejs的异步驱动, 就是利用操作系统的IO并发多进程线程处理。 如果你给nodejs10个任务, 他全部初始化后都交给操作系统。
2014年06月08日 04点06分
回复 此ID已被我抢注 : 你用java写也一样,只不过java自身要维护10个进程的内存, 其数据交互和并发IO还是操作系统来做。语言只是一个使用操作系统API,进行消息传递的功能,ta本身不具备物理驱动的能力。物理驱动是由操作系统实现的。
2014年06月08日 04点06分
level 5
看到楼上这么搞笑,我也来。
js:
线程1: 请求1 请求2 请求3 请求4 请求5 回调处理1 请求6 回调处理2 回调处理3 回调处理5
回调处理6 回调处理4
C# 设置线程池线程数固定为3
线程1:请求1 请求4 请求6 回调处理5
线程2:请求2 请求5 回调处理2 回调处理6
线程3:请求3 回调处理1 回调处理3 回调处理4
java 多线程固定线程数3个
线程1:请求1 阻塞 处理1 请求4 阻塞 处理4
线程2:请求2 阻塞 处理2 请求5 阻塞 处理5
线程3:请求3 阻塞 处理3 请求6 阻塞 处理6
无阻塞 C# 完爆js
完毕。
2014年06月20日 07点06分 10
C#不仅异步代码风格更好,而且还能利用线程池线程数优势同时处理更多CPU计算,js花了12单位时间,C#花了 4单位时间就完成了。 java 算他阻塞占2单位时间,8个单位事件完成,还是比js快,哈哈。随着阻塞时间的增加,可能js和java顺序会变化,但是C#继续完爆java和js。
2014年06月20日 08点06分
新手语言优势论., 什么时候来个IDE的?
2014年06月20日 14点06分
回复 云狼A大神 :大神你去用记事本写汇编,走好不送
2014年06月20日 14点06分
回复 sikele2236 :语言用的好不好和使用者的水平有关系. 你这么菜,或者说你身边的人这么菜, 当然会说别的语言不行. 你这种人CSDN上面一大吧. 和他们玩去?
2014年06月20日 15点06分
1