草庐IT

node.js - 网络 worker 线程 : is it OK to use "require" inside worker?

coder 2023-05-30 原文

(使用 Sails.js)

我正在为 Node 上长时间运行的进程测试 webworker-threads (https://www.npmjs.com/package/webworker-threads),以下示例看起来不错:

var Worker = require('webworker-threads').Worker;
var fibo = new Worker(function() {
    function fibo (n) {
        return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
    }
    this.onmessage = function (event) {
        try{
            postMessage(fibo(event.data));                

        }catch (e){
            console.log(e);                
        }
    }
});
fibo.onmessage = function (event) {
    //my return callback
};
fibo.postMessage(40);

但是,只要我添加任何代码来查询 Mongodb,它就会引发异常: (在查询中没有使用 Sails 模型,只是为了确保代码可以自己运行——db 没有密码)

var Worker = require('webworker-threads').Worker;
var fibo = new Worker(function() {
    function fibo (n) {
        return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
    }
    // MY DB TEST -- THIS WORKS FINE OUTSIDE THE WORKER
    function callDb(event){
        var db = require('monk')('localhost/mydb');
        var users = db.get('users');
        users.find({ "firstName" : "John"}, function (err, docs){
            console.log(("serviceSuccess"));
            return fibo(event.data);
        });
    }
    this.onmessage = function (event) {
        try{

            postMessage(callDb(event.data));     // calling db function now           

        }catch (e){
            console.log(e);                
        }
    }
});
fibo.onmessage = function (event) {
    //my return callback
};
fibo.postMessage(40);

由于 DB 代码在 Worker 之外工作得非常好,我认为它与 require 有关。我尝试了一些在 Worker 之外也可以使用的方法,比如

 var moment = require("moment");
 var deadline = moment().add(30, "s");

而且代码也抛出异常。不幸的是,console.log 只显示所有类型的错误:

{Object}
{/Object}

所以,问题是:在 Worker 中使用 require 是否有任何限制或指南?我在这里做错了什么?

更新

似乎线程不允许外部模块 https://github.com/xk/node-threads-a-gogo/issues/22

TL:DR I think that if you need to require, you should use a node's cluster or child process. If you want to offload some cpu busy work, you should use tagg and the load function to grab any helpers you need.

在阅读了这个帖子后,我发现这个问题与这个问题相似: Load Nodejs Module into A Web Worker

webworker-threads 的作者 Audreyt 回答说:

author of webworker-threads here. Thank you for using the module!

There is a default native_fs_ object with the readFileSync you can use to read files.

Beyond that, I've mostly relied on onejs to compile all required modules in package.json into a single JS file for importScripts to use, just like one would do when deploying to a client-side web worker environment. (There are also many alternatives to onejs -- browserify, etc.)

Hope this helps!

所以看来 importScripts 是要走的路。但是在这一点上,对于我想做的事情来说可能太hacky了,所以可能 KUE 是一个更成熟的解决方案。

最佳答案

我是 node-webworker-threads 的合作者项目。

node-webworker-threads

中不能require

您的更新是正确的:node-webworker-threads 不(当前)支持 requireing 外部模块。

它对某些内置函数的支持有限,包括文件系统调用和 console.log 版本。如您所见,在 node-webworker-threads 中实现的 console.log 的版本与内置的 console.log 不同> 在 Node.js 中;例如,它不会自动对 Object 的组件进行漂亮的字符串表示。

在某些情况下,您可以使用外部模块,正如 audreyt 在她的回复中所述。显然这并不理想,我将不完整的 require 视为 node-webworker-threads 的主要“破坏者”。我希望今年夏天能继续努力。

何时使用 node-webworker-threads

node-webworker-threads 允许您针对 WebWorker API 编写代码并在客户端(浏览器)和服务器(Node.js)中运行相同的代码。这就是为什么你会使用 node-webworker-threads 而不是 node-threads-a-gogo .

node-webworker-threads 如果你想要最轻量级的基于 JavaScript 的工作线程来做一些 CPU 密集型的事情,那就太好了。示例:素数、斐波那契、蒙特卡罗模拟、卸载内置但可能成本高昂的操作,如正则表达式匹配。

使用node-webworker-threads

node-webworker-threads 强调可移植性而非便利性。对于仅 Node.js 的解决方案,这意味着 node-webworker-threads 不是要走的路。

如果您愿意在全栈可移植性方面做出妥协,有两种方法可以走:速度和便利性。

对于速度,请尝试 C++ add-on .使用NaN .我推荐 Scott Frees 的 C++ and Node.js Integration书来学习如何做到这一点,它会为你节省很多时间。你需要为你的 C++ 技能复习付出代价,如果你想使用 MongoDB,那么这可能不是一个好主意。

为了方便,请使用 Child Process基于 worker 池,如 fork-pool .在这种情况下,每个 worker 都是一个成熟的 Node.js 实例。然后,您可以 require 满足您的需求。与 node-webworker-threads 或 C++ 附加组件相比,您需要付出更大的应用程序占用空间和更高的通信成本。

关于node.js - 网络 worker 线程 : is it OK to use "require" inside worker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30949987/

有关node.js - 网络 worker 线程 : is it OK to use "require" inside worker?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  6. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  7. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  8. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  9. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐