nodejs是单线程的,是不是意味着一个请求要花长时间计算时,
nodejs吧
全部回复
仅看楼主
level 9
wcandml 楼主
nodejs是单线程的,是不是意味着一个请求要花长时间计算或读取数据时,其他的请求就要阻塞,等待前面的请求完成???
2014年02月20日 09点02分 1
level 8
好像,正好相反
2014年02月20日 14点02分 2
说说呗!
2014年02月20日 15点02分
回复 wcandml :百度 有更权威的解释,我只是个菜鸟
2014年02月20日 15点02分
回复 不一样的俩个我 :我要是百度到了我就不来这人问了!
2014年02月20日 15点02分
回复 wcandml :异步
2014年02月20日 22点02分
level 7
实际上很多网络程序并不是在计算,而是在操作数据库和文件,这些东西跟 cpu 关系不大,使用异步非阻塞模型,实际上对于这些请求的处理更快,因为它是单线程,……
2014年02月21日 06点02分 3
说计算只是个比方!
2014年02月21日 07点02分
level 10
给你举个例子,两个setTimeOut,两个时间都写1000,但是第一个回调里进行1000万次的循环,然后打印一句话,第二个回调只打印一句话。你觉得执行顺序是什么样的
2014年02月22日 01点02分 5
如果前面在第一个请求里面的话。应该是在先循环1000次。打印一句话。然后第二个直接打印一句话。
2014年02月22日 01点02分
回复 wcandml :嗯,虽然两句话几乎同时打印,但也有先后顺序,说明被阻塞了
2014年02月22日 01点02分
回复 RacyiLy :阻塞我是明白的。主要是怎么改成非阻塞的!最近公司要求我学nodejs.然后写个完整的web应用,现在我在设计服务器用非阻塞的方式处理每个请求,但是我这出来的都是阻塞的!就像你刚才举的例子,第二个请求老是会被阻塞,怎么改成非阻塞的,意思是第二个请求先打印!
2014年02月22日 02点02分
回复 wcandml :node的长处并不是计算,而是擅长于网络密集的情况,会将所有事件放入一个事件队列依次执行,充分利用cpu去做这些事,当然如果一定要想你说的那样就得用多线程了,node也可以多线程,你可以自行搜索
2014年02月22日 02点02分
level 9
是的,应该避免同步的密集运算,可以拆分后用nextTick加入事件循环 避免阻塞
2014年02月22日 18点02分 6
恩,我会试一试的!
2014年02月22日 23点02分
level 3
计算会 但读数据肯定不会 因为读数据都是异步读取的
2014年04月01日 20点04分 7
嗯!
2014年04月02日 13点04分
level 12
非阻塞也得有非阻塞的实现去支持.
说白了就是提高单线程的执行能力.
2014年04月02日 06点04分 8
提高利用率
2014年04月02日 13点04分
level 11
同步运算的话会,可以用异步的方式操作
空闲的时候就运算,计算完了就回调,很快的
2014年04月03日 04点04分 9
level 10
我理解的话,因为基于回调函数的,所以每个cpu操作都很快,文件读写或数据库操作没完成前,已经异步做其他事情去了
2014年04月04日 15点04分 10
level 10
一句话回答,就是阻塞cpu,不阻塞I/O。
CPU上只有一个线程,所以当程序进行计算,占着CPU时,一切其他消息都被阻塞了。而当程序需要等待网络或磁盘等I/O设备时,CPU是空闲的,这个线程就会转去做其他事情。
callback的形式只是打破了顺序执行程序对I/O操作的依赖性,并没有使得cpu操作更快(相反,由于javascript本身的特性,它的cpu效率相对于很多其他语言是更低的)。但由于大多数web server都是I/O intensive的,等待I/O的时间远大于cpu计算的时间,所以node会比其他的程序快。
2014年09月04日 17点09分 11
小吧主讲得阻塞我已然明白,好棒,那能不能形象的科普一下不阻塞!
2015年06月08日 05点06分
level 10
回答你另一个问题,node处理新的请求不需要等前一个请求完成。
因为在node中响应一个http请求并不是通过一个event完成的。比方说你在第一个event的callback中解析request,然后提交数据库查询;第二个event中接收数据库查询结果,并触发读取模板文件;第三个event中把数据库查询结果填进模板,做成response的页面,发给client,完成http请求的处理。
node中每个event callback是原子操作,必须等前一个完成才能进行下一个,但一个http响应被拆成了几个callback来完成,在它们之间是可以穿插其他的任务的。
2014年09月04日 18点09分 12
小吧 知不知道国内有关于node的线下会议???在线等 比较急
2015年06月09日 00点06分
回复 hexinyu0713 :不知道啊,我是业余玩儿nodejs的。。
2015年06月09日 08点06分
@沙洲客🍼 哦 好的 不过还是谢谢啦
2015年06月09日 12点06分
level 1
其实,node还有子进程,当某些运算太过费时,可以丢给子进程运算,然后继续下个队列,当子进程运算完成后,再返回到队列中来,这样就可以充分利用多核CPU,而不是仅仅依靠CPU的单核来进行运算。
2014年10月22日 15点10分 13
level 2
虽然是单线程,但是可以通过异步模拟多线程,不会阻塞
2015年08月13日 09点08分 14
level 2
和js 还是不一样的!
2016年04月24日 05点04分 15
level 1
不会啊,单线程 和多线程 在于同时执行任务的多少,执行一个任务的话,单线程,和多线程 没什么区别,同时执行多个任务的话,多线程的优势就体现出来了,其实,计算机没有办法在同一时间同时处理的,这种看起来像是同时执行,实质上还是要排队执行,不知道说的对不对,差不多是这个意思
2016年04月29日 04点04分 17
level 5
现在可以用promise呀。
2016年05月02日 04点05分 18
level 4
node是异步的 明白了把
2016年05月11日 09点05分 21
level 14
node的异步逻辑通过调用libuv来实现。你去拿libuv写写程序就知道了。libev也成。
简单来说就是有个全局的eventloop,你拿libuv写程序的时候能自己看到。
2016年05月11日 13点05分 22
level 1
NODE 在白盒部分 也就是你们看到的部分 是单线程的运行 这个线程你也可以理解为主线程 , 黑盒部分 用C++编写 会有别的线程来支撑他来运行 主线程不阻塞!!就是循环去运行 可以理解为是一个公司的BOSS 他会发布任务!! 别的线程去执行!!!不断的循环来问你事情做完没有!!做完了就给我 我来组装!! 这样说 懂了吗/?? 其实不难理解 你的代码告诉了你的一切 全是回调函数!!
2016年05月23日 11点05分 23
1