我想使用多处理同时运行一系列冗长操作的多个进程(例如,使用计算机视觉同时点击程序(。我想在 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>
状态。