加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:16:40 所属栏目:Python 来源:网络整理
导读:我需要在轨道上移动一个小型电动马车.导轨上有一个红外探测器,以防止滑架走得太远.整个系统由Raspberry Pi 3监督. 我正在尝试使用多处理程序包设置两个进程:第一个是move_process,它基本上只调用一个函数来移动电机一定数量的步骤. def move(): motor.step(
我需要在轨道上移动一个小型电动马车.导轨上有一个红外探测器,以防止滑架走得太远.整个系统由Raspberry Pi 3监督.

我正在尝试使用多处理程序包设置两个进程:第一个是move_process,它基本上只调用一个函数来移动电机一定数量的步骤.

def move():
    motor.step(steps,direction,stepmode)
    watch_process.terminate()

第二个是watch_process,它调用一个无限循环函数,等待来自IR检测器的输入:

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()

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

编辑:错字

解决方法

你可以依靠信号来做到这一点.在引擎盖下,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,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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读