首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python多处理:两个线程互相停止

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

Stack Overflow用户
提问于 2017-03-15 03:09:56
回答 1查看 366关注 0票数 4

我需要在铁轨上移动一辆小型马达马车。钢轨上有一个红外线探测器,以防止车厢走得太远。整个系统由树莓派3监督。

我正在尝试使用多处理包设置两个进程:第一个是move_process,它基本上只调用一个函数,该函数将电机移动到选定的步数。

代码语言:javascript
运行
复制
def move():
    motor.step(steps, direction, stepmode)
    watch_process.terminate()

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

代码语言:javascript
运行
复制
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“按钮时,该函数将被激活:

代码语言:javascript
运行
复制
def on_go_pressed():
    move_process = multiprocessing.Process(target=move)
    watch_process = multiprocessing.Process(target=watch)
    move_process.start(), watch_process.start()

你能为这两个互相残杀的进程提供一个简单的解决方案吗?任何帮助都是非常感谢的。谢谢。

编辑:打字错误

EN

回答 1

Stack Overflow用户

发布于 2017-03-18 04:59:37

你可以依靠信号来做到这一点。在幕后,Process.terminate()方法向目标进程传递一个SIGTERM信号。

您需要一个队列或管道来将彼此的PID发送给进程。只有父进程可以这样做。

下面是一个使用两个管道的简单示例。

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42794597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档