如何在node.js中使非IO操作同步与asynchronous?
我知道这个标题听起来像是十几个其他问题,可能是这样。 不过,我已经阅读了十几个问题,并search了一下,发现没有什么能够回答这些问题让我满意。
这可能是因为没有人正确回答,在这种情况下,你应该投票给我。
这可能是因为我很愚蠢,不了解其他答案(更可能),在这种情况下,你应该投我一票。
语境:
我知道Node.js中的IO操作被检测到,并且默认情况下是asynchronous运行的。 我的问题是关于仍然可能阻塞/运行很长时间的非IO操作。
假设我有一个for
循环的函数blockingfunction
函数,它可以增加或不增加(纯CPU周期,无IO),还有很多。 运行需要一分钟或更长时间。
说我希望这个function运行,只要有人向我的服务器发出特定的请求。
题:
很明显,如果我在代码的外层显式调用这个循环,所有东西都会阻塞,直到完成。
我读过的大部分build议都build议先启动所有其他处理程序/服务器等,然后通过process.nextTick
或setTimeout(blockingfunction, 0)
推迟函数的调用。
-
但是不会
blockingfunction1
然后只是阻止下一个周围的执行循环? 我可能是错的,但似乎这样做会启动所有我的其他东西,而不会阻止应用程序,但是当第一次有人提出请求导致blockingfunction
被调用时,所有东西都会阻塞,只要它完成。 -
在
setTimeout
或process.nextTick
调用中,是否将blockingfunction
setTimeout
与未来的操作共存,而不会阻塞它们? -
如果没有,有没有办法使
blockingfunction
function,而不重写它? -
别人怎么处理这个问题呢? 我见过的很多答案都是“只要相信你的CPU密集的东西要快,它们就会”,但是这并不能令人满意。
-
缺less线程(在那里我可以保证,执行
blockingfunction
将与执行其他任何正在进行的交错),我应该重新编写CPU密集型/耗时循环使用process.nextTick
来执行一个固定的,有保证的每个滴答快速的迭代次数?
是的,你是对的。 如果你延迟你的function,直到下一个滴答声,它会阻止在那个滴答而不是当前的滴答。
不幸的是,这里没有什么魔法可以解决这个问题。 虽然可以在另一个进程中启动该function ,但根据自己的工作情况 ,这可能不值得一提。
我build议重新编写你的函数,使得工作发生一点,然后继续下一个勾号。 节点的滴答是非常有效的,如果需要的话,你可以每次迭代一个体面大小的循环来调用它们,而不需要大量的开销。 当然,你将不得不在你的代码中进行分析,看看会有什么影响。
是的,即使运行process.nextTick,阻塞函数也会阻塞。
一些选项:
-
如果真的需要一段时间,那么也许应该把它放到一个队列中,你可以有一个专门的工作进程来处理它。
1A。 Node.js具有subprocess的特性,专门用于分派具有内置通信通道的其他node.js文件。 因此,例如,您可以创build一个(或多个)线程来按顺序处理这些请求,然后响应并触发callback。 请参阅: http : //nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options
-
您可以将blockingFunction分解成循环运行的块。 让它用process.nextTick调用每一个X迭代,让其他事件被处理。