为了上下文化,我想通过 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
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) 我只是在试验工作进程,因此试试这个:
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 …
我正在尝试在 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 做任何额外的配置吗?
这里是 Golang 开发人员,正在尝试学习 JS (Node.js)。
我习惯于在 Go 中使用 goroutine,为了简单起见,我们假设它们只是线程(实际上它们并不完全是线程,更像是Green Threads,但请耐心等待!)。
现在想象一下,我想创建某种可以运行某些服务的服务endlessTask,例如,可以是从 websocket 接收数据并保持内部状态更新的函数,以便稍后查询。现在,我希望能够同时为多个用户提供服务,并且每个用户也可以在某个时刻停止其特定的正在进行的任务。在 Go 中,我可以为我的 生成一个 goroutine endlessTask,在请求调度程序中存储某种会话,以跟踪每个任务所属的用户。
我怎样才能在JS中实现这样的东西?我浏览了 Node.js API 文档,发现了一些有趣的事情:
我不确定如何在没有多线程或多处理的情况下处理这种情况。在这种情况下,工作线程解决方案是否可行?
任何意见或建议将不胜感激。谢谢!
我想在 node.js 应用程序中创建一个工作线程,并将当前上下文传递给新线程,这样我就可以在新线程中访问我的变量和函数,是否有一个库可以支持它?如果不是,我至少可以在它们之间传递一个匿名函数吗?
我最近阅读了 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
我有一个 Express 后端应用程序,它侦听来自 Web 应用程序的 http 请求。该后端应用程序在 AWS ECS Fargate 上运行。
所以我的问题是,在这个后端应用程序中使用 Node.js 中的多线程、工作线程是否有意义?端点中既有 CPU 密集型功能,也有非密集型功能。例如,无论调用强度如何,我是否应该立即将任何传入请求分发到其他线程,以便主线程永远不会被阻塞?或者我应该只在密集型作业等上使用多线程。
非常感谢有关此主题的任何建议、优点和缺点。