【问题标题】:Node worker thread can't load external module?节点工作线程无法加载外部模块?
【发布时间】:2014-05-12 21:40:54
【问题描述】:

我正在尝试在我的服务器上对 cpu 密集型作业进行多线程处理。我正在使用网络工作者线程。

Server.js:(相关部分)

var Worker = require('webworker-threads').Worker;
function doWork(req, res)
{   
    console.log("connection received");
    var fibo = new Worker('plainworker.js');

    fibo.onmessage = function (event) {
        res.json('fib(10) = ' + event.data);
    };

    fibo.postMessage(10);
}

plainworker.js:

var _ = require('underscore'); ///////////// <---- PROBLEM LINE

function fibo (n) {
          return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
        }
onmessage = function (event) {
  postMessage(fibo(event.data));
}

所以我注意到,如果我在我的 plainworker.js 文件中加载了一个模块,那么它就会崩溃并停止。如果我删除此行,那么一切正常。问题是,我想在我的工作人员中使用下划线...

有没有人有使用threads-a-gogo 或webworker-threads 的经验并且可以告诉我他们是否在工作线程中成功加载了外部模块?

【问题讨论】:

  • 您遇到的错误是什么?
  • 没有错误,如果我包含这行 var _ = require('underscore'); 只会导致服务器挂起;
  • 您可以将它加载到服务器中,然后将其作为参数传递给需要它的plainworker 方法吗?有什么要求吗?或者只是require('underscore')
  • Nope 传入也不起作用。任何要求都不起作用。

标签: javascript node.js concurrency


【解决方案1】:

看起来我必须使用“importScripts(..)”函数 (see here),因为 require 似乎在工作线程中不起作用。

plainworker.js:

importScripts('./node_modules/underscore/underscore.js');

function fibo (n) {
          return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
        }
onmessage = function (event) {
  postMessage(fibo(event.data));
}

【讨论】:

  • 这对我有用 - 下划线的路径是相对于 worker.js 文件的......但它会默默地失败
  • 在最新 node.js 的工作线程中使用 importrequire 的任何最新解决方案?
  • @datdinhquoc 有什么解决办法吗?
  • @m4heshd 我还没有找到 1,似乎工作线程仅适用于 vanilla js
  • @datdinhquoc 对我来说,需要软件包但不是文件,因为我正在使用 eval。我才意识到这一点。所以我将文件的绝对路径发送为workerData,并在工作人员内部要求它。像魅力一样工作。
猜你喜欢
  • 2019-12-02
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 2018-07-12
相关资源
最近更新 更多