Node js如何调度作业(非阻塞)
Node js how to schedule jobs (non-blocking)
我想每隔 x 秒将作业安排到 运行,那该怎么做呢。
一个例子是每 10 秒 ping 一次服务器,但所有这些都应该是异步的,所以其他功能都不会停止。
您需要利用多线程来制作非阻塞代码。我建议使用名为 worker_threads 的内置 node.js 多线程包。
https://nodejs.org/api/worker_threads.html
这取决于您所说的“none 其他功能停止”是什么意思。 ping 服务器已经是非阻塞和异步的,因为 nodejs 中的所有网络都是这样。
所以,代码如下:
setInterval(() => {
// put code to do the ping here
}, 5000);
不会阻塞您服务器的其余部分,因为对 ping 执行的代码已经是非阻塞的。
但是,您服务器的其余部分可能会阻止 setInterval()
准时触发。如果您在服务器中执行一些长 运行ning 阻塞代码,那么 setInterval()
计时器回调将不会发生,直到该代码完成,并且它可能会从计划的确切时间延迟到 运行.由于 nodejs 是单线程和事件驱动的,它无法处理下一个计时器事件,直到前一个事件(无论是什么)完成执行其代码的阻塞部分。
如果你想绝对确保你的计时器总是 运行 非常接近它应该 运行 的时间,你要么必须确保你的程序的其余部分永远不会阻塞很长时间或者您需要将计时器移出到另一个 Javascript 线程或进程中,并通过消息传递回主线程。
您可以在现有的 nodejs 进程中使用 WorkerThread,或者您可以使用 child_process 模块来 运行 一个单独的子程序来为您执行 ping 操作。 Nodejs 具有内置消息,可以从 WorkerThread 或 child_process 返回到主程序或从主程序返回。
我想每隔 x 秒将作业安排到 运行,那该怎么做呢。 一个例子是每 10 秒 ping 一次服务器,但所有这些都应该是异步的,所以其他功能都不会停止。
您需要利用多线程来制作非阻塞代码。我建议使用名为 worker_threads 的内置 node.js 多线程包。 https://nodejs.org/api/worker_threads.html
这取决于您所说的“none 其他功能停止”是什么意思。 ping 服务器已经是非阻塞和异步的,因为 nodejs 中的所有网络都是这样。
所以,代码如下:
setInterval(() => {
// put code to do the ping here
}, 5000);
不会阻塞您服务器的其余部分,因为对 ping 执行的代码已经是非阻塞的。
但是,您服务器的其余部分可能会阻止 setInterval()
准时触发。如果您在服务器中执行一些长 运行ning 阻塞代码,那么 setInterval()
计时器回调将不会发生,直到该代码完成,并且它可能会从计划的确切时间延迟到 运行.由于 nodejs 是单线程和事件驱动的,它无法处理下一个计时器事件,直到前一个事件(无论是什么)完成执行其代码的阻塞部分。
如果你想绝对确保你的计时器总是 运行 非常接近它应该 运行 的时间,你要么必须确保你的程序的其余部分永远不会阻塞很长时间或者您需要将计时器移出到另一个 Javascript 线程或进程中,并通过消息传递回主线程。
您可以在现有的 nodejs 进程中使用 WorkerThread,或者您可以使用 child_process 模块来 运行 一个单独的子程序来为您执行 ping 操作。 Nodejs 具有内置消息,可以从 WorkerThread 或 child_process 返回到主程序或从主程序返回。