gpt4 book ai didi

javascript - Node.js 中的内联子进程

转载 作者:行者123 更新时间:2023-11-30 20:30:45 26 4
gpt4 key购买 nike

我熟悉浏览器中的 Web Workers,并认为 Node.js 相当于做

const worker = new Worker('./worker')

const worker = child_process.fork('./worker')

API 有点不同,它们在幕后的工作方式并不完全相同,但最终 Web Worker 和子进程似乎都在做大致相同的事情;允许您并行运行 JavaScript 代码。

现在,可以使用 Web Workers 完成这件巧妙的事情,而不是通过传递包含 worker 代码的文件的路径/url 来创建 Worker,您可以传递一个实际的函数。这可以通过这个简单的三行函数来实现:

function createWorker(fn) {
var blob = new Blob(['self.onmessage = ', fn.toString()], { type: 'text/javascript' });
var url = URL.createObjectURL(blob);

return new Worker(url);
}

这允许你在主/主/父(无论你想怎么调用它)文件中内联编写你的工作代码,如下所示:

var myWorker = createWorker(function (e) {
self.postMessage(e.data.toUpperCase());
});

myWorker.onMessage = function (e) {
console.log(e.data); // HELLO FROM AN INLINE WORKER!
}

myWorker.postMessage('hello from an inline worker!')

问题
如何使用 Node.js 子进程实现相同的目的?通过查看文档,我无法判断您是否可以将模块路径以外的其他内容传递给 child_process.fork,或者是否有任何其他方法可以实现我想要的;编写内联子进程。

更新
根据@Bergi 在评论中的建议,我尝试了以下操作:

const fileSync = require('tmp').fileSync;
const writeFileSync = require('fs').writeFileSync;
const fork = require('child_process').fork;

function createWorker(fn) {
const tmpobj = fileSync();
writeFileSync(tmpobj.name, fn.toString());

return fork(tmpobj.name);
}

var myWorker = createWorker(function (e) {
process.send(e.toUpperCase());
});

myWorker.on('message', function (e) {
console.log(e); // HELLO FROM AN INLINE WORKER!
})

myWorker.send('hello from an inline worker!');

唉,我收到以下错误:

C:\Users\phili\AppData\Local\Temp\tmp-165566BgqUKKM5yjR.tmp:1
(function (exports, require, module, __filename, __dirname) { function (e) {
^

SyntaxError: Unexpected token (
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:616:28)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Function.Module.runMain (module.js:693:10)
at startup (bootstrap_node.js:188:16)
at bootstrap_node.js:609:3

恐怕我在这里超出了我的深度。知道发生了什么以及如何让它工作吗?

最佳答案

这是最终对我有用的东西:

const fileSync = require('tmp').fileSync;
const writeFileSync = require('fs').writeFileSync;
const fork = require('child_process').fork;



function createWorker(fn) {
const tmpobj = fileSync();
writeFileSync(tmpobj.name, `process.on('message', ${fn.toString()})`);

return fork(tmpobj.name);
}

var myWorker = createWorker(function (e) {
process.send(e.toUpperCase());
});

myWorker.on('message', function (e) {
console.log(e); // HELLO FROM AN INLINE WORKER!
})

myWorker.send('hello from an inline worker!');

非常感谢@Bergi 帮助解决了这个问题。

关于javascript - Node.js 中的内联子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50355260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com