所在的位置: js >> js优势 >> Nodejs并行实践问答

Nodejs并行实践问答

北京治疗白癜风去那个医院 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/nxbdf/

Node具有完全不同的编程范式,一旦正确理解,就更容易看到解决问题的不同方式。您永远不需要Node应用程序中的多个线程,因为您有不同的方式来执行相同的操作。您创建多个流程;但它与ApacheWebServer的Pforkmpm的功能非常不同。

现在,让我们假设我们只有一个CPU核心,我们将开发一个应用程序(以Node的方式)来完成一些工作。我们的工作是逐个字节地处理一个大文件。我们软件的最佳方法是从文件的开头开始工作,逐个字节地跟踪到最后。

嘿,hasan,我想你要么是新手要么和我爷爷一样的老派!为什么不创建一些线程并使其更快?哦,我们只有一个CPU核心。所以呢?创建一些线程,让它更快!它不像那样工作。如果我创建线程,我将使它变慢。因为我将在系统中添加大量开销以在线程之间进行切换,并在我的进程内尝试在这些线程之间进行通信。除了所有这些事实之外,我还必须考虑如何将单个作业分成多个可以并行完成的作业。好的,我觉得你很穷!我们用我的电脑,它有32个核心!哇,亲爱的朋友,你真棒,非常感谢你。我很感激!

然后我们回头工作。现在我们拥有32个cpu核心,感谢我们的朋友。我们必须遵守的规则刚刚改变了。现在我们想要利用我们给予的所有这些财富。要使用多个内核,我们需要找到一种方法将我们的工作分成可以并行处理的部分。

如果它不是Node.js,我们会为此使用线程;32个线程,每个cpu核心一个。但是,由于我们有Node.js,我们将创建32个Node进程。线程可以是Node进程的一个很好的替代方案,甚至可能是更好的方法;但只有在已定义工作的特定工作中,我们才能完全控制如何处理工作。除此之外,对于其他任何类型的问题,如果工作来自外部,我们无法控制,我们希望尽快回答,Node的方式将会是无可争议地更加优越。

嘿,Hasan,你还在单线程吗?你怎么了,伙计?我刚刚为你提供了你想要的东西。你没有任何借口了。创建线程,让它运行得更快。我已将作品分成几部分,每个进程都会同时处理其中一个部分。你为什么不创建线程?对不起,我觉得它不可用。要不你把你的电脑拿走?不行,我很酷,我只是不明白为什么你不使用线程?谢谢你的电脑。:)我已经将工作分成几部分,我创建了并行处理这些部分的流程。所有CPU核心都将得到充分利用。我可以用线程代替进程来做到这一点;但Node有另外一种方式,而我的老板ParthThakkar希望我使用Node。好的,如果你需要另一台电脑,请告诉我。:p

如果我创建了33个进程而不是32个进程,那么操作系统的调度程序将暂停一个线程,启动另一个进程,在一些循环后暂停它,再次启动另一个进程......这是不必要的开销。我不想要这个。实际上,在具有32个内核的系统上,我甚至不想创建正好32个进程,31个可以更好。

因为不仅仅是我的应用程序可以在这个系统上工作。为其他东西留一点空间可能会很好,特别是如果我们有32个房间。我相信我们现在在同一问题上了,现在的问题是关于充分利用处理器来执行CPU密集型任务。

嗯,hasan,我很抱歉嘲笑你一点。我相信我现在更了解你。但是我还需要解释一下:运行数百个线程的哼哼唧唧是什么?我到处都看到线程比创建进程更快创建?你创建进程而不是线程,你认为它是你这样使用Node是最优的。难道Node不适合这种工作吗?不用担心,我也很酷。每个人都说这些东西,所以我想我已经习惯了听到它们。那么?Nodejs不擅长此道?即使线程也很好,Nodejs对此非常有用。至于线程和进程创建开销;在你重复的事情上,每一毫秒都很重要。但是,我只创建了32个进程,这将花费很少的时间。它只会发生一次。它没有任何区别。我什么时候想创建数千个线程呢?你永远不想创建成千上万的线程。但是,在正在进行外部工作的系统上,例如处理HTTP请求的Web服务器;如果你为每个请求使用一个线程,你就真的会创建数千个线程的。Node.js有所不同吗?对?对,就是这样。这是Node真正闪耀的地方。就像线程比进程轻得多,函数调用比线程轻得多。Node.js调用函数,而不是创建线程。在Web服务器的示例中,每个传入的请求都会导致函数调用。嗯,有趣;但是如果不使用多个线程,则只能同时运行一个函数。当很多请求同时到达Web服务器时,它如何工作?关于函数如何运行,一次一个,从不并行运行,你是完全正确的。我的意思是在一个进程中,一次只运行一个代码范围。操作系统调度程序不会暂停此功能并切换到另一个功能,除非它暂停进程以给另一个进程留出时间,而不是我们进程中的另一个进程。那么一个进程如何一次处理2个请求?只要我们的系统有足够的资源(RAM,网络等),一个进程就可以同时处理数万个请求。这些功能如何运行是关键的差异。嗯,我现在应该兴奋吗?也许:)Node.js在队列上运行一个循环。在这个队列中是我们的工作,即我们开始处理传入请求的调用。这里最重要的一点是我们设计运行函数的方式。我们不是开始处理请求并让调用者等到我们完成工作,而是在完成可接受的工作量后快速结束我们的功能。当我们需要等待另一个组件做一些工作并返回一个值而不是等待它时,我们只需完成我们的功能,将剩下的工作添加到队列中。听起来太复杂了?不,不,我可能听起来很复杂;但系统本身非常简单,而且非常有意义。

现在我想停止引用这两个开发人员之间的对话,并在最后一个关于这些功能如何工作的快速示例之后完成我的回答。通过这种方式,我们正在做OSScheduler通常会做的事情。我们暂停我们的工作,并让其他函数调用(如多线程环境中的其他线程)运行,直到我们再次轮到我们。

这比将工作留给OSScheduler好得多,后者试图给系统上的每个线程提供时间。我们知道我们做得比OSScheduler做得好得多,我们应该在我们停止时停止。下面是一个简单的例子,我们打开一个文件并读取它来对数据做一些工作。同步方式:

打开文件重复这个:阅读一些做的工作

异步方式:

打开文件并在准备就绪时执行://我们的函数返回重复这个:阅读一些,当它准备就绪时://再次返回做一些工作

如您所见,我们的函数要求系统打开文件,而不是等待它打开。文件准备好后,通过提供后续步骤完成自己。当我们返回时,Node在队列上运行其他函数调用。在遍历所有函数之后,事件循环移动到下一轮...总之,Node具有与多线程开发完全不同的范式;但这并不意味着它缺乏东西。对于同步作业(我们可以决定处理的顺序和方式),它可以和多线程并行一样工作。对于来自外部的工作,如对服务器的请求,它就是更优越的。




转载请注明:http://www.aierlanlan.com/grrz/7513.html

  • 上一篇文章:
  •   
  • 下一篇文章: