Python 多处理:如何关闭作为一系列操作的长时间运行的进程



我想使用多处理同时运行一系列冗长操作的多个进程(例如,使用计算机视觉同时点击程序(。我想在 GUI 中实现一个停止按钮,允许我中途停止进程 - 但我不确定我该如何做这样的事情。

我知道如果有循环,我可以使用关闭事件来控制进程 - 但是在我的情况下,目标函数不是循环。下面是一些代码,我基本上只是对目标函数的每一行进行了事件检查:

(我删除了 tkinter 代码的很大一部分,因为它不相关,启动/停止功能适用于 GUI 中各自的按钮。

from multiprocessing import Event, Process
from time import sleep
def start_proc(self):
self.proc_stop_event.clear()
for i in range(4):
p = Process(target=long_sequential_tasks, args=(i,self.proc_stop_event))
p.start()
def stop_proc(self):
self.proc_stop_event.set()
#a series of lengthy, different and sequential tasks
def long_sequential_tasks(idx, event):
if not event.is_set(): <---
print(str(idx))
sleep(10) 
else:
break
if not event.is_set(): <---
print(str(idx * 2))
sleep(10)
else:
break
if not event.is_set(): <---
print(str(idx * 3))
sleep(10)
else:
break

每行检查事件状态显然不是解决方案,但我真的不知道我还能做什么。将来我想添加队列和锁来同步并行进程,显然 process.terminate 可以使它们挂起。

因此,如果 process.terminate 不是一个选项,我如何才能中断以干净的方式执行一系列操作的进程?或者我仍然可以终止进程,但对挂起的东西进行清理?

如何以干净的方式中断执行一系列操作的进程?

可以使用nanomsg或ZeroMQ实现信令/消息传递元平面,该元平面将智能通知进程(它正在检查是否存在这种<NO-GO>消息,例如在纯[SERIAL]工作流检查点阶段之间的适当位置( 一旦<NO-GO>消息到达,该进程可能会执行其自身运行的优雅清理和智能终止。

附加成本最低。

def long_sequential_tasks( idx ):
#-----------------------------------------------------------------------
# local
# mock-up soft-authentcation proxy
# for otherwise possible ( whitelisting & key-management & other tools available )
#
CONTROL_HASH_ID = "asdfhasrtbnastnve9vaergn9ervgnaeragiagiab - WHATEVER"
LENofMASK = len( CONTROL_HASH_ID )
#-----------------------------------------------------------------------
import zmq
aCtx = zmq.Context()
aSUB = aCtx.socket( zmq.SUB )
aSUB.setsockopt(    zmq.SUBSCRIBE, CONTROL_HASH_ID )
aSUB.setsockopt(    zmq.LINGER, 0 )
...
aSUB.connect( "<protocol>://<address-details>" ) # { ipc:// | tipc:// | norm:// | tcp:// | vmci:// | ...  }
if (  0 == aSUB.poll( 0, zmq.POLLIN )
or      aSUB.recv(    zmq.NOBLOCK )[:LENofMASK] != CONTROL_HASH_ID
):                    # <--- NO LEGAL EXPLICIT <NO-GO>-MESSAGE HERE
# continue planned work-step
...
if (  0 == aSUB.poll( 0, zmq.POLLIN )
or      aSUB.recv(    zmq.NOBLOCK )[:LENofMASK] != CONTROL_HASH_ID
):                    # <--- NO LEGAL EXPLICIT <NO-GO>-MESSAGE HERE
# continue planned work-step
...

以干净的方式实现所需的效果。

基于Tkinter MVCactor的GUI和任何其他控制消息的智能"源"都可以接受这个概念,并在tk.mainloop()调度程序的世界之外启动智能信令/消息传递,并轻松到达平台间集成计算外系统(将其用于具有AI/ML +交易后端生态系统的QuantFX原型的远程GUI已有十多年(。


另一种方法是通过使用自定义的信号处理程序来实现退出计划。这就不再需要以相当僵化的方式构建退出计划之后/之前的步骤顺序。信号处理程序可以"中断"计算流,并可能(相当残酷地(杀死自己的进程(如果必须优雅终止,则需要添加一些缓解措施(,但代表一个选项,如果运行工作流步骤值得停止某些外部逻辑,负责退出计划标记<NO-GO>状态。

相关内容

  • 没有找到相关文章

最新更新