如何在node.js中使非IO操作同步与asynchronous?

我知道这个标题听起来像是十几个其他问题,可能是这样。 不过,我已经阅读了十几个问题,并search了一下,发现没有什么能够回答这些问题让我满意。

这可能是因为没有人正确回答,在这种情况下,你应该投票给我。

这可能是因为我很愚蠢,不了解其他答案(更可能),在这种情况下,你应该投我一票。

语境:

我知道Node.js中的IO操作被检测到,并且默认情况下是asynchronous运行的。 我的问题是关于仍然可能阻塞/运行很长时间的非IO操作。

假设我有一个for循环的函数blockingfunction函数,它可以增加或不增加(纯CPU周期,无IO),还有很多。 运行需要一分钟或更长时间。

说我希望这个function运行,只要有人向我的服务器发出特定的请求。

题:

很明显,如果我在代码的外层显式调用这个循环,所有东西都会阻塞,直到完成。

我读过的大部分build议都build议先启动所有其他处理程序/服务器等,然后通过process.nextTicksetTimeout(blockingfunction, 0)推迟函数的调用。

  • 但是不会blockingfunction1然后只是阻止下一个周围的执行循环? 我可能是错的,但似乎这样做会启动所有我的其他东西,而不会阻止应用程序,但是当第一次有人提出请求导致blockingfunction被调用时,所有东西都会阻塞,只要它完成。

  • setTimeoutprocess.nextTick调用中,是否将blockingfunction setTimeout与未来的操作共存,而不会阻塞它们?

  • 如果没有,有没有办法使blockingfunctionfunction,而不重写它?

  • 别人怎么处理这个问题呢? 我见过的很多答案都是“只要相信你的CPU密集的东西要快,它们就会”,但是这并不能令人满意。

  • 缺less线程(在那里我可以保证,执行blockingfunction将与执行其他任何正在进行的交错),我应该重新编写CPU密集型/耗时循环使用process.nextTick来执行一个固定的,有保证的每个滴答快速的迭代次数?

是的,你是对的。 如果你延迟你的function,直到下一个滴答声,它会阻止在那个滴答而不是当前的滴答。

不幸的是,这里没有什么魔法可以解决这个问题。 虽然可以在另一个进程中启动该function ,但根据自己的工作情况 ,这可能不值得一提。

我build议重新编写你的函数,使得工作发生一点,然后继续下一个勾号。 节点的滴答是非常有效的,如果需要的话,你可以每次迭代一个体面大小的循环来调用它们,而不需要大量的开销。 当然,你将不得不在你的代码中进行分析,看看会有什么影响。

是的,即使运行process.nextTick,阻塞函数也会阻塞。

一些选项:

  1. 如果真的需要一段时间,那么也许应该把它放到一个队列中,你可以有一个专门的工作进程来处理它。

    1A。 Node.js具有subprocess的特性,专门用于分派具有内置通信通道的其他node.js文件。 因此,例如,您可以创build一个(或多个)线程来按顺序处理这些请求,然后响应并触发callback。 请参阅: http : //nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

  2. 您可以将blockingFunction分解成循环运行的块。 让它用process.nextTick调用每一个X迭代,让其他事件被处理。