我正在使用它的多处理模块编写一个Python程序。该程序调用许多辅助函数,每个函数都产生一个随机数。一旦其中一个工人产生大于0.7的数字,我就需要终止程序。
下面是我的程序,其中“如何执行此操作”部分尚未填写。知道吗?谢谢。
import time
import numpy as np
import multiprocessing as mp
import time
import sys
def f(i):
np.random.seed(int(time.time()+i))
time.sleep(3)
res=np.random.rand()
print "From i = ",i, " res = ",res
if res>0.7:
print "find it"
# terminate ???? Question: How to do this???
if __name__=='__main__':
num_workers=mp.cpu_count()
pool=mp.Pool(num_workers)
for i in range(num_workers):
p=mp.Process(target=f,args=(i,))
p.start()
有一种更干净的python方法来完成您想做的事情,它是通过使用
multiprocessing.Pool
提供的回调函数来实现的。您可以检查this question以查看实现示例。
任何进程都无法阻止类似于大锤的暴力。别去那儿。
要明智地做到这一点,您需要重新设计您的基本方法:主流程和工作流程需要相互通信。
我想充实一下,但到目前为止的例子是也没有什么用处。例如,如前所述,对
rand()
的调用不超过num_workers
,因此没有理由相信其中任何调用必须是>;0.7。一旦worker函数增长了一个循环,它就变得更加明显。例如,工作者可以检查是否在循环的顶部设置了
mp.Event
,如果设置了,则退出。主进程将在希望工人停止时设置Event
。当工人发现一个值>;0.7时,他可以设置一个不同的
mp.Event
。主进程将等待Event
,然后设置“停止时间”Event
供工作人员查看,然后执行常规的循环.join()
-让工作人员进行干净的关闭。编辑
假设工人们将继续工作,直到至少有人找到一个值>;0.7,这里将充实出一个便携、干净的解决方案。请注意,我从中删除了
numpy
,因为它与此代码无关。这里的代码在任何支持multiprocessing
的平台上的任何股票Python下都应该可以正常工作:以及一些示例输出:
一切都会干净地关闭:没有回溯,没有异常终止,没有留下僵尸进程。。。干净利落。
杀了它
正如@nosdafox所指出的,有一个
Pool.terminate()
方法尽其所能,跨平台杀死工作进程,不管它们在做什么(例如,在Windows上,它调用平台TerminateProcess()
)。我不建议在生产代码中使用它,因为突然终止进程可能会使各种共享资源处于不一致的状态,或者让它们泄漏。在multiprocessing
文档中有各种关于这个的警告,您应该在其中添加操作系统文档。不过,这可能是权宜之计!这是一个使用这种方法的完整程序。请注意,我将截止值提高到了0.95,使运行此操作比运行一个眼球链接更可能需要更长的时间:
以及一些示例输出:
正如其他一个用户所提到的,您需要这些进程相互通信,以便让它们终止其对等方。虽然可以使用os.kill终止对等进程,但发出终止信号更为方便。
我使用的解决方案非常简单: 一。找出主进程的进程ID(pid),它生成所有其他工作进程。此连接信息可从OS获得,OS跟踪从哪个父进程派生的子进程。 2。当其中一个工作进程达到您的结束条件时,它使用父进程ID查找主进程(包括它自己)的所有子进程,然后遍历列表并向它们发送结束信号(确保它没有向自己发送信号) 下面的代码包含工作解决方案。
输出清楚地说明了正在发生的事情:
相关问题 更多 >
编程相关推荐