标签: node-worker-threads

如何通过worker_thread.Worker传递带有函数的类实例来使用函数?

为了上下文化,我想通过 NodeJS“worker_thread”模块中的工作线程使用类实例函数。

在一个main.js文件中,我声明一个类并实例化一个新的 Worker,并通过选项传递新实例workerData

main.js

const { Worker } = require('worker_threads');

class obj {
    constructor() {
        this.a = "12";
        this.b = 42;
    }

    c() {
        return 'hello world';
    }
}

let newobj = new obj();
console.log({
    a: newobj.a,
    b: newobj.b,
    c: newobj.c()
});
//Output: { a: '12', b: 42, c: 'hello world' }

let worker = new Worker('./process.js', { workerData: { obj: newobj } });
worker.once('message', res => { console.log({ res }) });
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,工作人员调用了process.js脚本。让我们看看吧。 …

javascript multithreading worker-thread node.js node-worker-threads

10
推荐指数
1
解决办法
4217
查看次数

优化用 TypeScript 编写的文件内容解析器类

I got a typescript module (used by a VSCode extension) which accepts a directory and parses the content contained within the files. For directories containing large number of files this parsing takes a bit of time therefore would like some advice on how to optimize it.

I don't want to copy/paste the entire class files therefore will be using a mock pseudocode containing the parts that I think are relevant.

class Parser {
    constructor(_dir: string) {
        this.dir = _dir;
    } …
Run Code Online (Sandbox Code Playgroud)

javascript parallel-processing node-worker-threads

7
推荐指数
1
解决办法
122
查看次数

请求没有分布在他们的工作进程中

我只是在试验工作进程,因此试试这个:

const http = require("http");
const cluster = require("cluster");
const CPUs = require("os").cpus();
const numCPUs = CPUs.length;

if (cluster.isMaster) {
  console.log("This is the master process: ", process.pid);
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
  cluster.on("exit", (worker) => {
    console.log(`worker process ${process.pid} has died`);
    console.log(`Only ${Object.keys(cluster.workers).length} remaining...`);
  });
} else {
  http
    .createServer((req, res) => {
      res.end(`process: ${process.pid}`);
      if (req.url === "/kill") {
        process.exit();
      }
      console.log(`serving from ${process.pid}`);
    })
    .listen(3000);
}
Run Code Online (Sandbox Code Playgroud)

我使用负载测试来检查“请求是否分布在他们的工作进程中?” 但我得到了同样的process.pid …

child-process node.js node-worker-threads

6
推荐指数
1
解决办法
139
查看次数

打字稿找不到模块“worker_threads”

我正在尝试在 Node v14.15.1 中使用 node.js 'worker_threads' 库并收到此错误

Cannot find module 'worker_threads' or its corresponding type declarations.ts(2307)
Run Code Online (Sandbox Code Playgroud)
tsc 

src/api/services/email.service.ts:1:62 - error TS2307: Cannot find module 'worker_threads'.

1 import { Worker, isMainThread, parentPort, workerData } from 'worker_threads';
                                                              

Found 1 error.
Run Code Online (Sandbox Code Playgroud)

我的代码 -

import { Worker, isMainThread, parentPort, workerData } from 'worker_threads';
Run Code Online (Sandbox Code Playgroud)

工作线程在节点 11 之后变得稳定。所以它应该可以工作。我究竟做错了什么 ?

PS - 我用 JS 运行相同的代码,它运行良好,所以我不认为它的 Node.js 问题。其他核心库如 fs 也工作正常。我需要为 TS 做任何额外的配置吗?

node.js typescript node-worker-threads

5
推荐指数
1
解决办法
6769
查看次数

在 JS (Node.js) 中同时管理多个长时间运行的任务

这里是 Golang 开发人员,正在尝试学习 JS (Node.js)。

我习惯于在 Go 中使用 goroutine,为了简单起见,我们假设它们只是线程(实际上它们并不完全是线程,更像是Green Threads,但请耐心等待!)。

现在想象一下,我想创建某种可以运行某些服务的服务endlessTask,例如,可以是从 websocket 接收数据并保持内部状态更新的函数,以便稍后查询。现在,我希望能够同时为多个用户提供服务,并且每个用户也可以在某个时刻停止其特定的正在进行的任务。在 Go 中,我可以为我的 生成一个 goroutine endlessTask,在请求调度程序中存储某种会话,以跟踪每个任务所属的用户。

我怎样才能在JS中实现这样的东西?我浏览了 Node.js API 文档,发现了一些有趣的事情:

  • 集群:似乎并不完全是我正在寻找的
  • 子进程:可以工作,但我会为每个客户端/用户生成 1 个进程,我认为开销会很大
  • Worker 线程:更像是这样,但文档指出它们“对于执行 CPU 密集型 JavaScript 操作非常有用”并且“Node.js 内置异步 I/O 操作比 Workers 更高效”

我不确定如何在没有多线程或多处理的情况下处理这种情况。在这种情况下,工作线程解决方案是否可行?

任何意见或建议将不胜感激。谢谢!

javascript multithreading node.js node-worker-threads

5
推荐指数
1
解决办法
1147
查看次数

如何在工作线程之间共享上下文

我想在 node.js 应用程序中创建一个工作线程,并将当前上下文传递给新线程,这样我就可以在新线程中访问我的变量和函数,是否有一个库可以支持它?如果不是,我至少可以在它们之间传递一个匿名函数吗?

javascript v8 worker-thread node.js node-worker-threads

5
推荐指数
1
解决办法
2733
查看次数

是否可以使用 Node 工作线程来执行数据库插入?

我最近阅读了 Node 的“worker_threads”模块,该模块允许在多个线程中并行执行 Javascript 代码,这对于 CPU 密集型操作非常有用。(注意:这些不是 Chrome 在浏览器中制作的网络工作者)

我正在构建一个功能,我需要在不阻止浏览器的情况下执行大量 Postgres INSERT。

问题是:在我实例化 worker 的 Javascript 文件中,我不允许导入任何内容,包括本机 Node 模块或 NPM 库,如执行数据库查询所必需的 Knex.js。我收到一条错误消息:文件一执行,就不能在模块外使用 import 语句

我试过将工作代码放在另一个文件中,顶部有一个导入语句(同样的错误)。我尝试将 Knex 对象提供给 workerData,但它无法克隆非本地 JS 对象。

我没有想法 - 如果我们不能导入任何 NPM 库,有没有人知道如何在工作线程中与数据库交互?!?!

// mainThread.js

const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');

import knex from 'knex'; // --> *** UNCAUGHT EXCEPTION: Cannot use import statement outside a module ***

if (isMainThread) {
  module.exports = async function runWorker (rowsToInsert = []) {
    return new …
Run Code Online (Sandbox Code Playgroud)

worker-thread node.js import-module node-cluster node-worker-threads

3
推荐指数
1
解决办法
2275
查看次数

快速应用程序中的工作线程

我有一个 Express 后端应用程序,它侦听来自 Web 应用程序的 http 请求。该后端应用程序在 AWS ECS Fargate 上运行。

所以我的问题是,在这个后端应用程序中使用 Node.js 中的多线程、工作线程是否有意义?端点中既有 CPU 密集型功能,也有非密集型功能。例如,无论调用强度如何,我是否应该立即将任何传入请求分发到其他线程,以便主线程永远不会被阻塞?或者我应该只在密集型作业等上使用多线程。

非常感谢有关此主题的任何建议、优点和缺点。

multithreading backend node.js express node-worker-threads

3
推荐指数
1
解决办法
3161
查看次数