我刚刚观看了以下视频:Node.js 简介 http://www.yuiblog.com/blog/2010/05/20/video-dahl/并且仍然不明白如何获得速度优势。
主要是,Ryan Dahl(Node.js 的创建者)曾经说过,Node.js 是基于事件循环的,而不是基于线程的。线程是昂贵的,只能留给并发编程专家来使用。
随后,他展示了 Node.js 的架构堆栈,该堆栈具有底层 C 实现,内部有自己的线程池。显然,Node.js 开发人员永远不会启动自己的线程或直接使用线程池……他们使用异步回调。我就明白这么多了。
我不明白的是,Node.js 仍然在使用线程……它只是隐藏了实现,那么如果 50 个人请求 50 个文件(当前不在内存中),那么这不是需要 50 个线程吗? ?
唯一的区别是,由于它是内部管理的,Node.js 开发人员不必编写线程细节,但在底层它仍然使用线程来处理 IO(阻塞)文件请求。
那么,您是否真的只是解决一个问题(线程)并将其隐藏起来,而该问题仍然存在:主要是多线程、上下文切换、死锁...等?
这里一定有一些细节我仍然不明白。
实际上,这里混淆了一些不同的事情。但它始于这样一个模因:线程真的很难。因此,如果它们很难,那么在使用线程时,您更有可能 1) 由于错误而中断,2) 不会尽可能有效地使用它们。 (2) 是您要问的问题。
想想他给出的一个例子,其中一个请求进来,你运行一些查询,然后对结果执行一些操作。如果您以标准过程方式编写它,代码可能如下所示:
result = query( "select smurfs from some_mushroom" );
// twiddle fingers
go_do_something_with_result( result );
如果传入的请求导致您创建一个运行上述代码的新线程,那么您将有一个线程坐在那里,同时什么也不做query()
在跑。 (根据 Ryan 的说法,Apache 使用单个线程来满足原始请求,而 nginx 在他所讨论的情况下表现优于它,因为事实并非如此。)
现在,如果您真的很聪明,您可以用一种环境可以在运行查询时关闭并执行其他操作的方式来表达上面的代码:
query( statement: "select smurfs from some_mushroom", callback: go_do_something_with_result() );
这基本上就是 Node.js 正在做的事情。您基本上是在以一种方便的方式装饰您的代码,因为语言和环境,因此关于闭包的要点,环境可以聪明地了解运行的内容和时间。这样一来,node.js 就不是new从某种意义上说,它发明了异步 I/O(并不是任何人都声称有这样的东西),但它的新颖之处在于它的表达方式有点不同。
注意:当我说环境可以聪明地了解运行内容和运行时间时,我的具体意思是,用于启动某些 I/O 的线程现在可以用于处理其他一些请求,或者可以完成一些计算并行,或启动一些其他并行 I/O。 (我不确定节点是否足够复杂以针对同一请求启动更多工作,但您明白了。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)