Python多处理:两个线程相互停止

时间:2017-03-14 19:09:56

标签: python multiprocessing

我需要在轨道上移动一个小型电动马车。导轨上有一个红外探测器,以防止滑架走得太远。整个系统由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()

你能为那两个应该互相残杀的进程提供一个简单的解决方案吗? 任何帮助深表感谢。 谢谢。

编辑:错字

1 个答案:

答案 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)