Webworker-threads:在工作线程中使用“require”可以吗?

2024-05-26

(使用 Sails.js)

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

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);

由于数据库代码在 Worker 之外工作得很好,我认为这与require。我尝试过一些在 Worker 之外也有效的方法,比如

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

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

{Object}
{/Object}

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

UPDATE

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

TL:DR 我认为如果你需要要求,你应该使用节点的 集群或子进程。如果你想卸载一些CPU繁忙的工作, 你应该使用 tagg 和 load 函数来获取你想要的任何助手 需要。

读完这篇文章后,我发现这个问题与这个问题类似:将 Nodejs 模块加载到 Web Worker 中 https://stackoverflow.com/questions/14107521/load-nodejs-module-into-a-web-worker

webworker-threads 的作者 Audreyt 回答道:

webworker-threads 的作者在这里。感谢您使用该模块!

有一个默认的native_fs_对象和你可以使用的readFileSync 读取文件。

除此之外,我主要依靠 onejs 来编译所有必需的 将 package.json 中的模块放入单个 JS 文件中,以便 importScripts 使用,就像部署到客户端 Web Worker 时所做的那样 环境。 (还有很多onejs的替代品——browserify, ETC。)

希望这可以帮助!

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


我是以下项目的合作者节点 webworker 线程 https://github.com/audreyt/node-webworker-threads项目。

你不能require in node-webworker-threads

您的更新是正确的:node-webworker-threads(目前)不支持require荷兰国际集团外部模块。

它对某些内置程序的支持有限,包括文件系统调用和一个版本console.log。正如您所发现的,该版本console.log实施于node-webworker-threads与内置的不一样console.log在 Node.js 中;例如,它不会自动对对象的组件进行良好的字符串表示。

在某些情况下你can使用外部模块,正如 audreyt 在她的回复中概述的那样。显然这并不理想,我认为不完整require作为主要的“交易破坏者”node-webworker-threads。我希望今年夏天能从事这方面的工作。

何时使用node-webworker-threads

node-webworker-threads允许您针对 WebWorker API 进行编码并在客户端(浏览器)和服务器(Node.js)中运行相同的代码。这就是为什么你会使用node-webworker-threads over 节点线程 a-gogo https://github.com/xk/node-threads-a-gogo.

node-webworker-threads如果您想要最轻量级的基于 JavaScript 的工作线程来执行 CPU 密集型操作,那么这是很棒的选择。示例:素数、斐波那契、蒙特卡洛模拟、卸载内置但可能昂贵的操作(如正则表达式匹配)。

When not to use node-webworker-threads

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

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

For speed, try a C++ 附加组件 https://nodejs.org/api/addons.html. Use NaN https://github.com/nodejs/nan。我推荐斯科特·弗里斯的C++ 和 Node.js 集成 https://nodeaddons.com/book/书来学习如何做到这一点,它会节省你很多时间。你会因为需要温习 C++ 技能而付出代价,如果你想使用 MongoDB,那么这可能不是一个好主意。

For 方便, use a 子进程 https://nodejs.org/api/child_process.html基于工作池的类似叉池 https://www.npmjs.com/package/fork-pool。在这种情况下,每个工作线程都是一个成熟的 Node.js 实例。那么你可以require随心所欲。与其他应用程序相比,您将付出更大的应用程序占用空间和更高的通信成本node-webworker-threads或 C++ 附加组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webworker-threads:在工作线程中使用“require”可以吗? 的相关文章

  • socket.io 作为客户端

    有什么方法可以将socketio作为客户端运行 不是浏览器 而是nodejs脚本 我需要将数据从服务器广播到一些客户端 浏览器 和另一台linux机器 仅运行nodejs来获取变量 没有浏览器 欢迎任何想法 Regards github上有
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma
  • 如何使用 Karma 测试 NodeJS 后端代码(testaulous)

    如何设置 Karma 来运行我的后端单元测试 用 Mocha 编写 如果我将后端测试脚本添加到files 它未能说明require未定义 你不知道 Karma 仅用于测试基于浏览器的代码 如果您的项目在后端有 mocha 测试 在前端有 k
  • 如何在 Google Translate Node.js 代码中设置 API KEY

    我正在尝试创建一个使用 Google Translate API 的 Node js 代码 我从以下代码中得到了谷歌文档 https cloud google com translate docs translating text 但是当我
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 为 Node.js 客户端应用程序保留 Firebase 用户

    我正在使用 Firebase 构建 Node js 命令行界面 CLI 用于与后端进行身份验证 我想避免让用户每次运行命令时都输入密码 相反 我想实现一个 登录 流程 将凭证保留到文件系统 该凭证可用于后续的无密码身份验证 直到用户 注销
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • 如何将函数设置为 multer 上的限制参数?

    在这个问题之后 我可以使用 multer 和单个 html 表单上传不同文件夹中的多个文件吗 https stackoverflow com questions 39726862 cani upload many files in diff
  • Interlocked.CompareExchange 的返回值是否有一些充分的理由

    The Interlocked CompareExchange 方法 docs https learn microsoft com en us dotnet api system threading interlocked comparee
  • 从 Nodejs 提供二进制/缓冲区/base64 数据

    我在从节点提供二进制数据时遇到问题 我开发了一个名为的节点模块节点说话它执行 TTS 文本到语音 并返回 Base64 编码的音频文件 到目前为止 我这样做是为了转换base64到缓冲区 二进制文件 然后提供它 var src Base64
  • 如何唤醒正在休眠的线程?

    我在加载事件中创建了一个线程 如下所示 Thread checkAlert null bool isStop false private void frmMain Load object sender EventArgs e checkAl
  • 优化计算中使用的 # 个线程的算法

    我正在执行一个操作 我们将其称为CalculateSomeData CalculateSomeData 在连续的 代 中运行 编号为 1 x 整个运行中的代数由CalculateSomeData 的输入参数固定 并且是先验已知的 完成一次生
  • 进度条没有进展

    我有一个正在更新 sqlserver 中的表的程序 我有一个表单 我想显示其进度 进度条正在递增 但没有显示 我需要为此使用后台工作者吗 我正在做什么的例子 public void updateTable string tableName
  • Node Sass 没有绑定您当前的环境

    我在 SO 上看到过很多这样的问题 但似乎没有一个能解决或匹配问题 Node Sass 找不到适合您当前环境的绑定 带有 Node js 6 x 的 Windows 64 位 奇怪的是 我没有安装 Node js 6 x 从命令行 node
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 无锁算法真的比全锁算法性能更好吗?

    陈雷蒙德 http blogs msdn com b oldnewthing 一直在做一个huge http blogs msdn com b oldnewthing archive 2011 04 15 10154245 aspx ser

随机推荐

  • Android Studio SDK 安装程序在解压缩“platform-tools/systrace/NOTICE”时无限期挂起

    adb 无法从命令提示符处使用 设置了正确的路径 我认为平台工具的原始安装出现了问题 Studio 告诉我更新 但每次都会发生这种情况 我的机器上似乎缺少 adb exe this is the android studio event l
  • 如何在 jQuery 中使用特定值来定位特定属性? [复制]

    这个问题在这里已经有答案了 我试图解决的问题是 编写函数newMessage 该函数接收主题名称作为参数 函数应将 p 标签的背景颜色更改为红色 其中数据主题名称为 topicName 例如 如果 HTML 是 div p General
  • 使用 Elixir 设置日期格式

    我正在尝试将 Timex 模块格式化为某种外观 我正在尝试获取今天的日期 但我希望它的格式如下 2017 12 12 年 月 日 在 ruby 中 我会去 strftime 类 但我不知道如何使用 Elixir 来做到这一点 目前的尝试 T
  • Eclipse java 断点 - 目的是什么?

    我正在学习 Android 教程 刚刚进入调试部分 我想知道断点的用途是什么 我还不能告诉 它实际上停止了应用程序 以便我可以确定它运行到该点 或者我可以设置多个断点并将它们用作标记来从断点到断点检查 停止和运行 我的代码 断点是执行停止的
  • 如何将 ZF2 单元/应用程序模块测试合并到单个调用中?

    我遵循将测试存储在模块中的 ZF2 约定 并且当从每个模块内运行测试时一切正常 我想做的是有一个根级别的 phpunit xml 来调用各个模块测试并将它们合并以生成代码覆盖率数据和其他指标 问题是每个单独的测试套件都是在模块化 phpun
  • 从 Apache Kafka 中的主题删除消息

    所以我是 Apache Kafka 的新手 我正在尝试创建一个简单的应用程序 以便我可以更好地理解 API 我知道这个问题在这里被问了很多 但是如何清除存储在主题上的消息 记录 我看到的大多数答案都说要更改消息保留时间或删除并重新创建主题
  • Yegge 的原型模式示例如何处理实例变量?

    我喜欢史蒂夫 耶吉的原型模式示例 http steve yegge blogspot com 2008 10 universal design pattern html并决定快速制作一个概念验证示例 不过 我并没有真正考虑清楚 虽然它非常适
  • asp.net mvc - 如何在 javascript 中循环访问模型数据

    我试图用 javascript 将数据添加到列表框 但是字符串构建语法让我难住了 var yourobject 导致错误 字符文字中的字符太多 全部代码 var mlb cm createListBox mylistbox title My
  • Typescript 参数 - 对象的通用数组和对象键的数组(部分)

    我想要一个接受对象数组和一些对象键数组的方法 该方法将返回对象值数组的数组 但仅返回选定键的数组 data firstName Jane lastName Doe firstName John lastName Doe fields fir
  • C 风格强制转换与内在强制转换

    假设我已经定义了 m256d x我想提取低 128 位 我会做 m128d xlow mm256 castpd256 pd128 x 然而 我最近看到有人这样做 m128d xlow m128d x 是否有用于演员的首选方法 为什么要用第一
  • iOS 11.x 系统颜色

    我读过很多关于如何自定义视图颜色的文章 但没有任何关于检索标准控件 如 iOS 11 x 或以前版本中的导航栏 状态栏和选项卡栏 的系统颜色的文章 UIColor 类有 3 种系统颜色 但它们几乎没有用 例如 调用 UINavigation
  • PowerShell:如何在名称为“*”(星号/星号)的文件/文件夹上创建选择器?

    我需要从 PS 修改注册表 此注册表项与特定文件 所有扩展的文件夹 的上下文菜单相关 HKEY CURRENT USER Software Classes 目前我想将项目添加到此路径 HKCU Software classes shell
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • onKeyDown 和 onKeyLongPress

    我希望我的应用程序对音量按钮的正常按键事件和长按按键事件做出不同的反应 我已经看过了this https stackoverflow com questions 7493531 trying to catch the volume onke
  • Python,socket.error:[Errno 10049]

    在开发一个简单的聊天客户端的基础上 遇到以下错误 socket error Errno 10049 The requested address is not valid in its context 代码是 from socket impo
  • 支持的 Android 设备:0 台设备

    我们是 TourisMap 的开发商 我们不明白为什么在 Google Play 开发者控制台上上传 apk 后 我们支持 0 台设备 我们个人的想法是 Manifest 和 build gradle 都可以 我们可以生成 apk 然后我们
  • INSERT INTO ... SELECT ... 是否始终按序号位置匹配字段?

    我的测试似乎证实了这一点 INSERT INTO a x y SELECT y x FROM b maps b y to a x 即字段仅按顺序位置匹配 而不按名称匹配 情况总是如此吗 即 我可以依赖这种行为吗 很遗憾 文档 http ms
  • 将 wgs 84 转换为纬度/经度

    你好 我在弄清楚如何在坐标类型之间进行转换时遇到了一些麻烦 我有一个坐标集列表 其描述如下 坐标始终采用 WGS84 系统 所有坐标 a 均表示为整数 值 x 和 y 其中坐标值乘以 1 000 000 一个例子 559262 631951
  • 是否有适合 Java 1.4 和 SE (Swing) 应用程序的优秀 DI 框架?

    我正在寻找一个适用于在 JDK 1 4 下运行的 Java SE Swing 应用程序的依赖注入框架 有没有我可以使用的推荐 DI 框架 Guice 和其他基于注释的框架已经退出 我不想搞乱像 Retroweaver 这样的东西 另外 Sp
  • Webworker-threads:在工作线程中使用“require”可以吗?

    使用 Sails js 我正在测试 webworker threads https www npmjs com package webworker threads https www npmjs com package webworker