javascript - Webwork-threads Nodejs 访问作用域外的函数/变量

标签 javascript node.js multithreading web-worker

我在访问 javascript 函数或工作线程中的任何变量时遇到问题。我正在使用 WebWorker-thread nodejs 库来执行多线程。

var fs = require('fs');
var path = require('path');
var threadPool=Worker.createPool(5).all.eval(writeKeywordsToFile);

function getKeywords() {

    var keywords = ["Restaurant", "Food", "Cusine"];
    for (var i = 0; i < keywords.length; i++) {
        threadPool.any.eval('writeKeywordsToFile(' + JSON.stringify(keywords[i]) + ',' + i + ',' + JSON.stringify(path.join(__dirname, '../', 'tmp/')) + ')', function (err, val) {
            console.log(' [' + this.id + '] ---- >'  + err);                

        });
        //writeKeywordsToFile(keywords[i], i , path.join(__dirname, '../', 'tmp/'));
    }
}

function writeKeywordsToFile(keywords, i, dirPath) {


    if (keywords != undefined) {
        var fileName = "Document_" + i + ".txt";
        console.log(fileName);
        var stream = fs.createWriteStream(dirPath + fileName, fs);

        stream.once('open', function (fd) {
            console.log('stream open');

            stream.write(keywords + "\r\n");
            stream.end();
        });
    }
    return keywords;
}

getKeywords();

无法访问 fs 以创建流并写入文件。我如何访问 writeKeywordsToFile() 中的任何 javascript 函数或变量,有什么解决方法吗?

最佳答案

工作人员只能通过向原始范围发送消息或从该范围接收消息来与该范围进行通信。出于所有意图和目的,您应该将线程视为存在于其自己的单独范围中。我承认我的经验完全基于与实际的网络 worker 一起工作,所以我不确定这在多大程度上适用于基于 Node 的解决方案(尽管它应该适用,因为共享范围上的多线程会带来 hell 和你的代码该死)

因此,主线程中全局范围内的任何内容都不存在于其工作人员范围中......

如果你想用它做任何事情,你必须在工作线程中 require('fs') 。

关于javascript - Webwork-threads Nodejs 访问作用域外的函数/变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31401273/

相关文章:

node.js - 如果没有中间件处理传递给 “next”的错误,该怎么办?

Java 日志记录线程阻塞

multithreading - 如何在 Android 平台的 unity3d 中使用 c# 线程?

c# - Winforms 应用程序中的可怕 "Callback chains"

javascript - 当鼠标未悬停在元素上方时使用 onmouseout 运行?

javascript - 自动缩放表单后如何重置屏幕缩放

javascript - 找不到模块 './fonoapi.node.js',但列出时会显示该模块

javascript - NodeJS readdirSync() 未执行

javascript - 如何在 D3 中悬停时为图像添加边框

javascript - 点击复制没有复制按钮