仅供参考:我已经和Web Workers一起做了这件事,它工作正常,但我只是在探索使用process.nextTick可以做什么和不可以做什么.
所以我有一个数百万个元素的数组,我在Node.JS中排序.我希望Node能够在执行此操作时响应其他请求.
有没有办法让Array.prototype.sort()不阻止其他进程?由于这是一个核心功能,我无法插入任何process.nextTick().
我可以手动实现快速排序,但我无法看到你如何高效地执行此操作,这是一种延续传递方式,这似乎是process.nextTick()所必需的.我可以修改for循环来执行此操作,但sort()似乎是不可能的.
最佳答案 虽然不可能使Array.prototype.sort以某种方式本身异步运行,但异步排序肯定是可能的,如
this sorting demo所示,以证明setImmediate(shim)优于setTimeout的速度优势.
遗憾的是,源代码似乎没有任何许可证.在https://github.com/jphpsf/setImmediate-shim-demo演示的Github回购将Jason Weber命名为作者.您可能想问他是否要使用(部分)代码.
我认为如果你使用setImmediate(从节点0.10开始可用),各个排序操作将与I / O回调有效地交错.对于如此大量的工作,我不推荐process.nextTick(如果它可以工作,因为有1000个maxTickDepth限制).有些背景见setImmediate vs. nextTick.
使用setImmediate而不是普通的“同步”处理总体上会更慢,因此您可以选择按“tick”处理一批单独的排序操作以加快速度,但节点是Node在此期间没有响应.我认为速度和响应能力与I / O之间的正确平衡只能通过实验找到.
更简单的替代方法是更像网络工作者:生成子进程并在那里进行排序.然后,您面临的最大问题是将已排序的数据传输回主进程(可能会生成某种输出). AFAIK对于Node.js来说没有像transferable objects那样的东西.在缓冲了已排序的数组之后,您可以将结果流式传输到子进程stdout并解析主进程中的数据,或者更简单;使用child process messaging.
你可能没有备用的cpu核心,所以子进程会入侵其他进程cpu时间.为避免排序过程损害您的其他进程,您可能需要为其分配低优先级.使用Node本身似乎不可能做到这一点,但你可以尝试使用nice,如下所述:https://groups.google.com/forum/#!topic/nodejs/9O-2gLJzmcQ.我没有这方面的经验.