在Node.JS,任何方式使Array.prototype.sort()屈服于其他进程?

仅供参考:我已经使用Web Workers完成了这项工作,并且工作正常,但是我只是在探索process.nextTick能做什么和不能做什么。

所以我有一百万个元素,我在Node.JS中进行sorting。 我希望Node在响应其他请求的同时执行此操作。

有没有办法让Array.prototype.sort()不阻止其他进程? 由于这是一个核心function,我不能插入任何process.nextTick()。

我可以手动实现快速sorting,但是我看不到如何有效地执行这种快速sorting,这似乎是process.nextTick()所必需的。 我可以修改一个for循环来做到这一点,但sort()似乎是不可能的。

虽然无法使Array.prototype.sort以某种方式asynchronous执行本身,但asynchronoussorting绝对有可能,正如此sorting演示所示,以展示setImmediate(shim)超过setTimeout的速度优势。

不幸的是,源代码似乎没有任何许可证。 在https://github.com/jphpsf/setImmediate-shim-demo的Github repo的演示名为Jason Weber作者。 你可能想问他是否要使用(部分)代码。

我认为,如果使用setImmediate(自节点0.10起可用),那么单独的sorting操作将与I / Ocallback有效交织。 对于如此大量的工作,我不会推荐process.nextTick(如果它工作的话,因为有1000 maxTickDepth限制)。 有关背景,请参阅setImmediate和nextTick 。

使用setImmediate而不是简单的“同步”处理肯定总体上会比较慢,所以你可以select每个“tick”处理一批单独的sorting操作来加快速度,代价是Node在这段时间内没有响应。 我认为在I / O速度和响应能力之间的正确平衡只能通过实验find。

一个更简单的替代方法是更像Web工作者:产生一个subprocess并在那里进行sorting。 那么你面临的最大问题是将sorting的数据传回给主进程(据推测会产生某种输出)。 AFAIK没有像Node.js可转移的对象 。 在对已sorting的数组进行缓冲之后,可以将结果stream式传输到subprocess标准输出并parsing主进程中的数据,或者可能更简单; 使用subprocess消息 。

你可能没有一个闲置的CPU核心,所以subprocess会侵入一些其他进程的CPU时间。 为了避免sorting过程对其他进程造成伤害,您可能需要将其分配给低优先级。 看起来Node不能做到这一点,但你可以尝试使用nice ,如下所述: https : //groups.google.com/forum/# ! topic/nodejs/9O-2gLJzmcQ 。 我在这个问题上没有经验。

那么,我最初以为你可以使用async.sortBy ,但仔细检查后,似乎不会像你所需要的那样。 虽然目前还没有被接受的答案,但请参阅Array.sort和Node.js中的类似问题。