node.js中的多线程/集群,

mzillmmw  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(320)

嗨,我需要在节点集群上的帮助这是程序的框架

global values a,b,c

function1{

get data from websocket and update the value a,b,c for every incomming message from datastream.

}

function2{
    while(1){

        do some processing using a,b,c values.
    }
}

函数1更新数据一次,如果从websocket流中获取任何数据,数据可能随时到达-例如有时每秒钟100个数据,有时每10秒2个数据。因此,无论数据何时到达,函数2都必须运行(即连续运行)
需要并行运行这些函数1和2,就像在不同的cpu上(或作为群集)尝试在async.parallel上运行一样,但它在单个线程上运行,因此直到函数2中的while循环结束为止,函数1将是o pause。因此,不能使用它,因此需要在不同的线程上并发运行。我看到了集群模块,并尝试使用它,但是,看到这个场景了吗

if (cluster.isPrimary) {

    function 1()

    //creating child process in other thread
    cluster.fork();

} else {

    function 2()
}

但在这种情况下,子集群无法访问全局值a、b、c,因为它们是使用函数1更新/分配的,所以子集群无法访问主集群的全局变量a、b、c,子集群的a、b、c将为空,因为它不会在子线程上运行函数1。我需要的是在不同的线程上并行运行这两个函数。运行cluster.fork时,有没有办法在另一个线程中运行函数2,以便它可以访问全局变量a、b、c。
----实际代码是这样的

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

var t = 1;
var pca = "1";
var pcb = "1";
var pta = "1";
var ptb = "1";
var datato = {
    "method": "SUBSCRIBE",
    "params": [
        "trxusdc@bookTicker"
    ],
    "id": 1
}
var axios = require('axios');
var configt = {
    method: 'get',
    url: 'https://api.binance.com/api/v3/ticker/bookTicker?symbol=TRXUSDT',
    headers: {}
};
var configc = {
    method: 'get',
    url: 'https://api.binance.com/api/v3/ticker/bookTicker?symbol=TRXUSDT',
    headers: {}
};
async function mymodule_init0() {
    axios(configc)
        .then(function(response) {
            pca = JSON.parse(JSON.stringify(response.data)).askPrice;
            pcb = JSON.parse(JSON.stringify(response.data)).bidPrice;
            console.log("1");

            //--------subaxios for usdt
            axios(configt)
                .then(function(response) {
                    pta = JSON.parse(JSON.stringify(response.data)).askPrice;
                    ptb = JSON.parse(JSON.stringify(response.data)).bidPrice;
                    console.log("2");
                    // mymodule_init1();
                })
                .catch(function(error) {
                    console.log(error);
                });

        })
        .catch(function(error) {
            console.log(error);
        });

}

async function mymodule_init1() {

    const WS = require('ws')
    const ws = new WS('wss://stream.binance.com:9443/ws/trxusdt@bookTicker')

    ws.on('message', function incoming(sdata) {

        if (JSON.parse(sdata).s == "TRXUSDC") {
            pca = JSON.parse(sdata).a;
            pcb = JSON.parse(sdata).b;
        }
        if (JSON.parse(sdata).s == "TRXUSDT") {
            pta = JSON.parse(sdata).a;
            ptb = JSON.parse(sdata).b;
        }

        if (t == 1) {
            ws.send(JSON.stringify(datato));
            t++;
        }

    });

}

async function mymodule_init2() {

    while (1) {

        console.log(pca + " \t " + ptb + "\t" + pta + " \t " + pcb );

    }

}

setTimeout(function() {
    new Promise(resolve => {

        if (cluster.isPrimary) {
            console.log(`Primary ${process.pid} is running`);

            // Fork workers.
            for (let i = 0; i < numCPUs; i++) {
                cluster.fork();
            }

            cluster.on('exit', (worker, code, signal) => {
                console.log(`worker ${worker.process.pid} died`);
            });
        }
        parallel(mymodule_init1(), mymodule_init2());

    })
}, 5000);

mymodule_init0();

所以我需要在不同的线程中运行模块init 2,我的意思是,无论主线程中的函数是什么,它都应该并行/单独运行

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题