gpt4 book ai didi

javascript - Nodejs管理不同的线程

转载 作者:行者123 更新时间:2023-12-03 05:52:48 24 4
gpt4 key购买 nike

我是 Nodejs 的新手。我正在使用 Nodejs - 快速解决方案。当某些信息添加到 MSSSQL 数据库时,我想发送电子邮件。这对我来说效果很好。问题是我想每五分钟检查一次添加到数据库中的信息是否被修改,如果没有,则再发送一封电子邮件。将信息添加到数据库的调用是这样的:

router.post('/postlinevalidation', function(req, res) {
//insert function into mssql
silkcartCtrl.sendMail(req, res);
});

发送电子邮件的 Controller 部分:

exports.sendMail  = function(req, res) {

var emails = "";

fs.readFile('./config/email.conf', 'utf8', function (err,data) {
if (err) {
return logger.error(err);
}
emails = data;
});

var minutes = 5, the_interval = minutes * 60 * 1000;
var refreshId = setInterval(function() {
logger.info("I am doing my 5 minutes check FL_PENDIENTE");

var request = new sql.Request(req.dbsqlserver);
var sqlpendinglinesvalidation = "SELECT [FK_IDCHECK],[FK_IDPEDIDO],[BK_IDPROVEEDOR],[DE_PROVEEDOR]"+
",[FK_FAMILIA],[BK_FAMILIA],[FK_SUBFAMILIA],[BK_SUBFAMILIA],[FK_ARTICULO]"+
",[BK_ARTICULO],[FL_VALIDAR],[DT_FECHA],[FL_PENDIENTE],[DES_CHECK],[QNT_PROPUESTA],[FECHA]"+
"FROM TABLE"+
" WHERE [FL_PENDIENTE] = 1";

request.query(sqlpendinglinesvalidation, function (err, recordset) {

if (recordset.length > 0) {
var transporter = nodemailer.createTransport('smtps://user%40gmail.com:pwd@smtp.gmail.com');

var mailOptions = {
from: '"Mailer" <mail@mail.com>', // sender address
to: emails, // list of receivers
subject: 'Tienes compras pendientes de validar', // Subject line
text: 'Tienes compras pendientes de validar', // plaintext body
html: '<b>Tienes compras pendientes de validar.</b>' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return logger.error(error);
}
logger.info('Message sent: ' + info.response);
});
} else {
clearInterval(refreshId);
return true;
}
});
}, the_interval);
};

正如我所说,这运作良好。我用setInterval控制五分钟但我假设每次调用路由 poSTLinevalidation 时,都会打开一个新线程,因此我将运行多个 setInterval 进程。我想知道如何管理它。如果 Controller 函数 exports.sendMail 正在运行,当再次调用路由时,“杀死此进程”,然后再次启动 exports.sendMail

提前致谢

最佳答案

But I supossed every time the route postlinevalidation is called, a new thread is open, so I will have several setInterval processes running.

不,这不是 Node.js 的工作原理。由于多个 setInterval() 计时器,您不会获得多个线程。

node.js 本身是单线程的。因此,每次调用路由时,它都会在 Node.js 事件队列中创建一个事件,并且按照 FIFO 的方式为它们提供服务,一次一个。在任何时候,其中一个路由处理程序进行异步调用时,它本质上都会“让出”控制权,并且事件队列中的下一项开始运行,直到它让出或完成。

setInterval() 这样的定时器也使用事件队列,因此 setInterval() 不会创建额外的线程。使用 native 代码的 Node.js 模块本身可能会使用线程,而 Node.js 使用一个用于磁盘管理网络的小型线程池,但这两者都与 setInterval() 没有任何关系。 >.

如果您明确希望为 Node.js 中的长时间运行操作创建另一个执行上下文,以将其与单个 Node.js 线程分开,那么通常使用属于 Node.js 一部分的子进程模块来完成。您创建一个新进程(可以是 node.js 进程或在该进程中运行的其他程序),然后您可以与该其他进程进行通信。

If the controller function exports.sendMail is running, when the route is called again, "kill this process", and start again exports.sendMail

这需要成为 nodemailer 模块的显式功能,以便您取消正在进行的操作。如何实现和控制“进程中”异步操作不是通用的 Node.js 事物,而是特定于特定模块如何实现事物并跟踪事物的方式。

查看 Node-mailer 的代码,更具体地说是 smtp-connection 模块,它看起来像是使用普通的异步 Node.js 套接字代码。这意味着它不会自行创建任何新线程或进程。

对于 setInterval() 调用,您需要确保创建 setInterval() 的任何代码体都会跟踪间隔计时器 ID,并最终清除间隔,使其停止,并且您不会不断堆积越来越多的间隔计时器。另一种可能性是您只有一个间隔,它会检查所有未完成的操作(而不是为每个操作都有一个单独的间隔)。

关于javascript - Nodejs管理不同的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40078458/

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