2014-09-13 64 views
0

想象一下,你將有很多長處理器密集型任務將某些字符串翻譯成別的東西。您將希望擁有一個實際線程池,以保持主節點線程正常運行並充分利用您的內核。哪個響應屬於node.js threadPool中的哪個任務?

執行此操作的主要方法是執行Threads-a-gogoWebworker-Threads,並啓動16個線程池(例如,在具有8個內核的英特爾上,通常同時有16個線程)。

對線程發出請求稱爲事件或消息。獲得迴應也會觸發事件或收到消息。但是這對於threadPool是如何工作的?

如果您跳過Webworker API,TAGG和Webworkers for node具有相同的基礎API。您可以使用threadPool.load加載所有工作人員的翻譯功能,並使用threadPool.any將任務定位到其中一個工作人員。

但想象一下,我現在有50個任務(要翻譯的字符串)排隊。 threadPool最終會發出50個事件(帶有翻譯字符串的響應),而不會告訴我該響應屬於哪個任務?

我想我從根本上誤解了threadPool的一件事。

有沒有一種方法,我可以只添加一個任務到threadPool隊列,並接收回調時特定任務完成?

回答

1

爲什麼從線程池中發出事件時,只要返回翻譯後的字符串?代碼返回的值由您傳遞給threadpool.any.eval()的回調接收。例如:

threadPool.any.eval('return "hello world"', function(err, data) { 
    // data === 'hello world' 
}); 
+0

這可能正是我所需要的。我接近接受這一點。我非常關注webworker API(node-webworker-threads)和'onmessage''事件,我沒有對'eval'進行足夠的關注;我認爲這是'load'的內聯變體,它也有一個cb,但是我想在加載初始函數(不執行它)時已經完成了。有沒有使用Webworkers API來模擬這種行爲的方法? – Redsandro 2014-09-13 14:53:42

+0

使用Web Workers時,您只有'postMessage()',並且沒有內置線程池。然而,如果你想重新使用一個工作者,你需要做的事情就是將回調與工作請求進行匹配,並將請求數據傳遞給某種唯一的ID,以便工作者可以通過postMessage()結果和原始ID都可以匹配回調。 – mscdex 2014-09-13 15:15:19

相關問題