nodejs服务器实时调用多个python脚本的解决方案
Solution for calling multiple python scripts in real time from a nodejs server
好吧,这是一个有点复杂的问题,我尽量对其进行足够广泛的解释,以便您能够理解我们需要什么。
该项目是关于一些由 raspi 控制的步进电机,它 运行 是一个 nodejs 服务器,为 webapp 提供服务。 Webapp 通过 websocket 与 nodejs 服务器通信。
您可以在 webapp 中使用摇杆控制方向和速度,每次值更改时,webapp 都会向服务器发送带有 websocket 协议的消息。
当 nodejs 服务器收到这些消息时,它会启动一个子进程,如下所示:
child_process.exec('python /home/pi/Adafruit-Motor-HAT-Python-Library/examples/StartStepper.py 10 1 10 0', function (err, stdout, stderr) {
if (err) {
console.log("child processes failed with error code: " +
err.code);
}
console.log(stdout);
});
我为步进器设置了脚本,这样我就可以将步数、rpm 和步进样式设置为脚本的参数。
所以这一切都很好,我可以用我的事件等启动脚本。
但是如果我移动操纵杆,脚本会被调用多次,这还不错,因为如果我从左切换到右或者如果我改变速度就必须调用它,但是脚本就像在一个堆栈上,当一个新的开始时不要停止,他们只是做他们的工作并且 运行 直到他们完成。我希望它们在再次调用脚本时立即停止,但我对 python 并没有那么深入。也许它甚至可以工作,改变线程的属性,它在 运行 时间内控制步进器?对此我不确定。我只想实时控制我的步进器,这很遗憾 python,因为步进器控制器不支持其他语言。
更新:
所以我现在尝试在执行新进程之前终止进程:
var child_process = require('child_process');
child_process.kill(); //Default killSignal
child_process.exec('python /home/pi/Adafruit-Motor-HAT-Python-Library/examples/StartStepperL.py 10 1 10 0', function (err, stdout, stderr) {
if (err) {
console.log("child processes failed with error code: " +
err.code);
}
console.log(stdout);
});
这显然行不通,因为我不处理 killSignal,但我不知道在哪里处理它,我已经阅读了相关文档。
为什么不始终保留对子进程的引用,并且在生成新进程之前,如果存在旧进程,则将其杀死。通过这种方式,您可以从 node.js 应用程序处理这一切。
检查子进程终止:
https://nodejs.org/api/child_process.html#child_process_child_kill_signal
好吧,这是一个有点复杂的问题,我尽量对其进行足够广泛的解释,以便您能够理解我们需要什么。
该项目是关于一些由 raspi 控制的步进电机,它 运行 是一个 nodejs 服务器,为 webapp 提供服务。 Webapp 通过 websocket 与 nodejs 服务器通信。
您可以在 webapp 中使用摇杆控制方向和速度,每次值更改时,webapp 都会向服务器发送带有 websocket 协议的消息。
当 nodejs 服务器收到这些消息时,它会启动一个子进程,如下所示:
child_process.exec('python /home/pi/Adafruit-Motor-HAT-Python-Library/examples/StartStepper.py 10 1 10 0', function (err, stdout, stderr) {
if (err) {
console.log("child processes failed with error code: " +
err.code);
}
console.log(stdout);
});
我为步进器设置了脚本,这样我就可以将步数、rpm 和步进样式设置为脚本的参数。
所以这一切都很好,我可以用我的事件等启动脚本。
但是如果我移动操纵杆,脚本会被调用多次,这还不错,因为如果我从左切换到右或者如果我改变速度就必须调用它,但是脚本就像在一个堆栈上,当一个新的开始时不要停止,他们只是做他们的工作并且 运行 直到他们完成。我希望它们在再次调用脚本时立即停止,但我对 python 并没有那么深入。也许它甚至可以工作,改变线程的属性,它在 运行 时间内控制步进器?对此我不确定。我只想实时控制我的步进器,这很遗憾 python,因为步进器控制器不支持其他语言。
更新: 所以我现在尝试在执行新进程之前终止进程:
var child_process = require('child_process');
child_process.kill(); //Default killSignal
child_process.exec('python /home/pi/Adafruit-Motor-HAT-Python-Library/examples/StartStepperL.py 10 1 10 0', function (err, stdout, stderr) {
if (err) {
console.log("child processes failed with error code: " +
err.code);
}
console.log(stdout);
});
这显然行不通,因为我不处理 killSignal,但我不知道在哪里处理它,我已经阅读了相关文档。
为什么不始终保留对子进程的引用,并且在生成新进程之前,如果存在旧进程,则将其杀死。通过这种方式,您可以从 node.js 应用程序处理这一切。
检查子进程终止: https://nodejs.org/api/child_process.html#child_process_child_kill_signal