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

时间:2012-08-05 16:17:24

标签: node.js asynchronous nonblocking

我知道这个标题听起来像是十几个其他问题,但很可能。但是,我已经读了十几个问题,并且用Google搜索了一段时间,发现没有什么可以满足我的回答。

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

这可能是因为我愚蠢而且不理解其他答案(更有可能),在这种情况下你应该投票给我。

上下文

我知道Node.js中的IO操作被检测到并默认以异步方式运行。我的问题是关于非IO操作仍然可能会阻塞/运行很长时间。

假设我有一个函数blockingfunction,其中for循环可以添加或者什么(纯CPU循环,没有IO),还有很多。运行需要一分钟或更长时间。

假设我希望每当有人向我的服务器发出特定请求时都会运行此功能。

问题:

显然,如果我在代码中的外层显式调用此循环,一切都会阻塞直到它完成。

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

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

  • blockingfunction置于setTimeoutprocess.nextTick调用中是否会使其与未来的操作共存而不会阻止它们?

  • 如果没有,有没有办法让blockingfunction做到这一点而不重写它?

  • 其他人如何处理此问题?我见过的很多答案都是“只要相信你的CPU密集型产品要快,它们就会”,但这并不令人满意。

  • 缺少线程(我可以保证blockingfunction的执行将与正在执行的任何其他操作交错),我是否应重新编写CPU密集型/耗时的循环使用process.nextTick执行每个tick的固定,保证快速的迭代次数?

2 个答案:

答案 0 :(得分:2)

是的,你是对的。如果你将你的函数推迟到下一个滴答,那么它只会阻止那个滴答而不是当前的滴答。

不幸的是,这里没有任何魔法可以解决这个问题。虽然可以fire up that function in another process,但可能不值得麻烦,这取决于你正在做什么。

我建议重新编写你的功能,使工作稍微发生,然后在下一个刻度上继续。节点刻度非常有效......如果需要,你可以在一个体面大小的循环的每次迭代中调用它们,而不需要大量的开销。当然,您必须在代码中对其进行分析,以了解其影响。

答案 1 :(得分:2)

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

一些选项:

  1. 如果确实需要一段时间,那么也许它应该被分拆到一个队列,你可以让一个专门的工作进程来处理它。

    1a上。 Node.js具有子进程风格,专门用于分配具有内置通信通道的其他node.js文件。所以例如你可以创建一个(或几个)按顺序处理这些请求的线程,然后响应并点击回调。请参阅:http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

  2. 您可以将blockingFunction拆分为循环中运行的块。让它用process.nextTick调用每个X迭代来让其他事件处理。