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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |