2013-04-13 24 views
4

僅供參考:我已經在Web Workers中完成了這項工作,它工作正常,但我只是在探索process.nextTick可以做什麼和不可以做什麼。在Node.JS中,有什麼方法可以讓Array.prototype.sort()屈服於其他進程?

所以我有一個數百萬的元素,我在Node.JS中排序。我希望Node在執行此操作時響應其他請求。

有什麼辦法讓Array.prototype.sort()不阻止其他進程?由於這是一個核心功能,我無法插入任何process.nextTick()。

我可以手動實現快速排序,但我無法看到你如何有效地做到這一點,這是繼續傳遞式的,這似乎是process.nextTick()所必需的。我可以修改for循環來做到這一點,但sort()似乎不可能。

回答

0

嗯,我最初認爲你可以使用async.sortBy,但仔細檢查後,它似乎不會像你需要的那樣。查看Array.sort and Node.js也有類似的問題,但目前還沒有可接受的答案。

+0

是的 - 異步和類似的庫,用於將已經*異步的函數連接在一起,而不會從回調地獄中瘋狂。它們並不神奇地使函數異步或非阻塞。這就是爲什麼我們有'process.nextTick()'。 – NeilK

2

雖然無法使Array.prototype.sort以某種方式異步運行,但異步排序絕對有可能,如this sorting demo所示,以展示setImmediate(shim)超過setTimeout的速度優勢。

不幸的是,源代碼似乎沒有附帶任何許可證。該演示的Github回購https://github.com/jphpsf/setImmediate-shim-demo以Jason Weber爲作者。您可能想問他是否要使用代碼的(部分)。

我認爲,如果使用setImmediate(自節點0.10起可用),那麼單獨的排序操作將與I/O回調有效交織。對於如此大量的工作,我不會推薦process.nextTick(如果它可以工作,因爲有maxTickDepth 1000的限制)。有些背景參見setImmediate vs. nextTick

使用setImmediate代替普通的「同步」處理肯定會整體上變慢,所以你可以選擇處理一批單個的排序操作,以加快速度,代價是Node沒有響應時間。我認爲速度和響應能力之間的正確平衡與I/O只能在實驗中找到。

一個更簡單的替代方法是更像Web工作者:產生一個子進程並在那裏進行排序。你面臨的最大問題是將排序後的數據傳回給主進程(據推測會產生某種輸出)。 AFAIK沒有什麼像Node.js的transferable objects。緩存已排序的數組之後,您可以將結果流式傳輸到子進程標準輸出並解析主進程中的數據,或者可能更簡單;使用child process messaging

您可能沒有閒置的cpu核心,所以子進程會侵入其他進程cpu時間。爲了避免排序過程損害其他進程,您可能需要將其分配給低優先級。這看起來不可能通過Node本身來實現,但您可以嘗試使用nice,如此處所述:https://groups.google.com/forum/#!topic/nodejs/9O-2gLJzmcQ。我沒有這方面的經驗。

相關問題