【发布时间】:2018-05-31 11:29:52
【问题描述】:
我正在运行许多子进程(比我拥有的内核还多),如果其中一个满足特定条件,我会设置一个全局变量的值 global bailout。
如果设置了bailout,那么所有后续子进程都会尽快退出。
参见例如这个简单的例子,我将我的 20 次调用的结果乘以 loop() 函数,但如果其中任何一个调用返回零,我就会“退出”:
import sys
import random
import multiprocessing
def loop(tup):
global bailout
if bailout==1: # obey a global bail out "flag"
return 0
x = random.random() - 0.5
if x < 0:
bailout = 1 # set a global bail out "flag"
return 0
return x
def top():
global bailout
bailout = 0
runtups = 20 * [[0]] # a dummy parameter [0] for function "loop"
pool = multiprocessing.Pool()
results = pool.imap(loop, runtups)
pool.close()
res = 1
sys.stdout.write("1")
for result in results:
sys.stdout.write(" * %g" % result)
res = res * result
sys.stdout.write(" = %g\n" % res)
top()
它工作得很好(或者准确地说,每次我尝试过它都有效)。即我的桌面有 4 个内核,如果前 4 个子进程之一将 bailout 设置为 1(在本示例中几乎总是发生),那么所有后续运行都会在 if bailout==1 条件下退出。 p>
但它安全吗?
我的意思是,子进程所能做的就是将 bailout 设置为 1。但是如果两个子进程都想将 bailout 设置为 1 怎么办?他们是否有可能同时尝试,导致救助变得不确定?还是保证这永远不会发生,(可能是因为顶层进程总是串行处理已完成的子进程?)
【问题讨论】:
-
如果不是很明显,我要做的就是从并行循环中“中断”,一旦我知道运行“循环”的剩余运行不会影响我的答案。所以真正的问题是,打破并行循环的最佳方法是什么。
标签: python parallel-processing multiprocessing global globals