2012-08-05 83 views
1

我知道这个标题听起来像是十几个其他问题的重复,很可能。但是,我已经阅读了这些问题,并且搜索了一段时间,并没有发现任何回答这些问题令我满意的东西。如何在node.js中创建非IO操作同步与异步?

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

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

语境:

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

说我有一个功能blockingfunction与一个for循环,做加法或whatnot(纯粹的CPU周期,没有IO),和它的很多。运行需要一分钟或更长时间。

说我希望此功能在有人向我的服务器发送特定请求时运行。

问:

显然,如果我明确地在我的代码外水平调用这个循环中,一切都将阻塞,直到它完成。

我读过的大多数建议,建议通过启动所有我的其他处理器/服务器等第一,并通过process.nextTicksetTimeout(blockingfunction, 0)推迟函数的调用将其推出进入未来。

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

  • 是否将blockingfunction放入setTimeoutprocess.nextTick以某种方式使其与未来的操作共存而不会阻塞它们?

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

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

  • 缺席线程(在这里我可以保证的blockingfunction执行将与任何其他人是怎么回事的执行交织),要我重新写CPU密集型/耗时循环使用process.nextTick执行固定的,保证快速的迭代次数?

回答

2

是的,你是对的。如果您延迟您的功能直到下一个勾号,它将会阻止该勾号而不是当前勾号。

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

我建议重新编写你的函数,让它工作一段时间,然后继续下一个勾号。节点滴答是非常有效的......如果需要的话,你可以称它们为每次体面大小循环的迭代,而不需要大量的开销。当然,你必须在你的代码中对它进行分析,以了解它的影响。

2

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

一些选项:

  1. 如果它确实需要一段时间,那么或许应该纺出到一个队列,你可以有一个专门的工作进程进行处理。 1)。 Node.js具有子进程特别用于分派具有内置通信通道的其他node.js文件。所以例如您可以创建一个(或几个)线程来按顺序处理这些请求,然后响应并触发回调。请参阅:http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options

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