我需要在轨道上移动一个小型电动马车。导轨上有一个红外探测器,以防止滑架走得太远。整个系统由Raspberry Pi 3监督。
我正在尝试使用多处理程序包设置两个进程:第一个是move_process
,它基本上只调用一个函数来移动电机一定数量的步骤。
def move():
motor.step(steps, direction, stepmode)
watch_process.terminate()
第二个是watch_process
,它调用无限循环函数,等待来自红外探测器的输入:
def watch()
while True:
detector_input = GPIO.input(18)
if detector_input == False:
move_process.terminate()
break
如果探测器发送输入,我希望watch_process
杀死move_process
。如果一切正常,我也希望move_process
杀死watch_process
,即当电机成功移动而不触发探测器时。
我定义了一个按下“go”按钮时触发的函数:
def on_go_pressed():
move_process = multiprocessing.Process(target=move)
watch_process = multiprocessing.Process(target=watch)
move_process.start(), watch_process.start()
你能为那两个应该互相残杀的进程提供一个简单的解决方案吗? 任何帮助深表感谢。 谢谢。
编辑:错字
答案 0 :(得分:0)
你可以依靠信号来做到这一点。在引擎盖下,Process.terminate()
方法向目标进程发送SIGTERM
信号。
您需要一个队列或管道来向进程发送彼此的PID。只有父进程才能这样做。
这是一个使用两个管道的简单示例。
import os
import signal
import multiprocessing
def watch(pipe)
move_process_pid = pipe.recv()
while True:
if not GPIO.input(18):
os.kill(move_process_pid, signal.SIGTERM)
return
def move(pipe):
watch_process_pid = pipe.recv()
motor.step(steps, direction, stepmode)
os.kill(watch_process_pid, signal.SIGTERM)
def on_go_pressed():
move_process_reader, move_process_writer = multiprocessing.Pipe(False)
watch_process_reader, watch_process_writer = multiprocessing.Pipe(False)
move_process = multiprocessing.Process(target=move, args=(move_process_reader,))
watch_process = multiprocessing.Process(target=watch, args=(watch_process_reader,))
move_process.start()
watch_process.start()
move_process_writer.send(watch_process.pid)
watch_process_writer.send(move_process.pid)