我知道这个标题听起来像是十几个其他问题,但很可能。但是,我已经读了十几个问题,并且用Google搜索了一段时间,发现没有什么可以满足我的回答。
这可能是因为没有人正确回答,在这种情况下你应该投票给我。
这可能是因为我愚蠢而且不理解其他答案(更有可能),在这种情况下你应该投票给我。
上下文
我知道Node.js中的IO操作被检测到并默认以异步方式运行。我的问题是关于非IO操作仍然可能会阻塞/运行很长时间。
假设我有一个函数blockingfunction
,其中for
循环可以添加或者什么(纯CPU循环,没有IO),还有很多。运行需要一分钟或更长时间。
假设我希望每当有人向我的服务器发出特定请求时都会运行此功能。
问题:
显然,如果我在代码中的外层显式调用此循环,一切都会阻塞直到它完成。
我读过的大多数建议建议首先启动所有其他处理程序/服务器等,然后通过process.nextTick
或setTimeout(blockingfunction, 0)
推迟调用该函数。
但是blockingfunction1
不会阻止执行循环的下一次旋转吗?我可能是错的,但似乎这样做会启动我的所有其他东西而不会阻止应用程序,但是当第一次有人提出导致blockingfunction
被调用的请求时,一切都会阻止它需要完成。
将blockingfunction
置于setTimeout
或process.nextTick
调用中是否会使其与未来的操作共存而不会阻止它们?
如果没有,有没有办法让blockingfunction
做到这一点而不重写它?
其他人如何处理此问题?我见过的很多答案都是“只要相信你的CPU密集型产品要快,它们就会”,但这并不令人满意。
缺少线程(我可以保证blockingfunction
的执行将与正在执行的任何其他操作交错),我是否应重新编写CPU密集型/耗时的循环使用process.nextTick
执行每个tick的固定,保证快速的迭代次数?
答案 0 :(得分:2)
是的,你是对的。如果你将你的函数推迟到下一个滴答,那么它只会阻止那个滴答而不是当前的滴答。
不幸的是,这里没有任何魔法可以解决这个问题。虽然可以fire up that function in another process,但可能不值得麻烦,这取决于你正在做什么。
我建议重新编写你的功能,使工作稍微发生,然后在下一个刻度上继续。节点刻度非常有效......如果需要,你可以在一个体面大小的循环的每次迭代中调用它们,而不需要大量的开销。当然,您必须在代码中对其进行分析,以了解其影响。
答案 1 :(得分:2)
是的,即使你运行它,阻塞函数也会一直阻塞process.nextTick。
一些选项:
如果确实需要一段时间,那么也许它应该被分拆到一个队列,你可以让一个专门的工作进程来处理它。
1a上。 Node.js具有子进程风格,专门用于分配具有内置通信通道的其他node.js文件。所以例如你可以创建一个(或几个)按顺序处理这些请求的线程,然后响应并点击回调。请参阅:http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options
您可以将blockingFunction拆分为循环中运行的块。让它用process.nextTick调用每个X迭代来让其他事件处理。