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