iam使用以下组件编写原型应用程序:
我开始用nodejs(typescript)编程,我得到了与其他服务的连接。现在我在nodejs中遇到了cron-jobs的问题。 我使用node-cron来执行cronjob。
在一项工作中,我需要获得更多pc的状态并对其进行总结。如果我这样做,这将阻止主线程。 所以我认为我需要在一个单独的线程中。
我如何在nodejs中执行此操作?我应该使用webworker-threads吗? 我是在正确的方式吗? 我应该更好地使用Java(Grails / Spring)吗? 我非常喜欢nodejs的简单性(对于http客户端,...)
希望有人能以正确的方式给我希望。
答案 0 :(得分:0)
我将使用Node Cluster。使用集群,master可以创建多个worker,这意味着你的cron不会阻止传入的请求。只要确保只有一名工人在做Cron。
我之前从未使用过node-cron,但我有使用SyncedCron的经验。但应该是一样的。
对于http客户端,有很多库可以执行此操作,您可以检查Request或httpclient。
您的代码应如下所示:
var cluster = require('cluster');
var http = require('http');
var numWorkers = require('os').cpus().length-1; // just give 1 cpu for OS to use, or maybe 2
if (cluster.isMaster) {
console.log('Master cluster setting up ' + numWorkers + ' workers...');
var cronPID=null;
for(var i = 0; i < numWorkers; i++) {
var worker=cluster.fork();
if(i==0){
//instructing the first worker to assume role of SyncedCron.
worker.send('you do it!');
cronPID=worker.process.pid;
console.log("worker "+cronPID+" choosed as Cron worker!");
}
}
cluster.on('online', function(worker) {
console.log('Worker ' + worker.process.pid + ' is online');
});
cluster.on('exit', function(worker, code, signal) {
// have to revive the worker
console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
console.log('Starting a new worker');
var newWorker=cluster.fork();
if(cronPID==worker.process.pid)
{ // need to re-elect a new cron worker!
newWorker.send('you do it!');
cronPID=newWorker.process.pid;
console.log("worker "+cronPID+" choosed as Cron worker!");
}
});
}else
{ // worker sides
process.on('message', (msg) => {
// validate your message that you get
// if validated, create a cron job here
});
// create your express below, I assume you use express instead of node's http library
var express = require('express');
var app = express();
app.post...........
}
注意: