gpt4 book ai didi

python - 通过全局标志变量进行进程间信号传输的 python 多处理安全吗?

转载 作者:行者123 更新时间:2023-12-01 02:22:05 26 4
gpt4 key购买 nike

我正在运行许多子进程(比我拥有的核心还要多),如果其中一个子进程满足特定条件,我会设置一个全局变量的值全局救助

然后,如果设置了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状况。

但是安全吗?

我的意思是,子进程所能做的就是将 bailout 设置为 1。但是如果两个子进程都想将 bailout 设置为 1 怎么办?他们是否有可能同时尝试,导致救助变得不确定?或者是否保证这种情况永远不会发生,(也许是因为顶级流程总是串行处理已完成的子流程?)

最佳答案

全局变量不在进程之间共享。如果您向循环添加一些日志记录,您可以看到到底发生了什么:

def loop(tup):
global bailout
if bailout==1:
print(f'pid {os.getpid()} had bailout 1')
return 0
x = random.random() - 0.5
if x < 0:
print(f'pid {os.getpid()} setting bailout 1')
bailout = 1
return 0
return x

这将产生如下输出:

pid 30011 setting bailout 1
pid 30013 setting bailout 1
pid 30015 setting bailout 1
pid 30009 setting bailout 1
pid 30010 setting bailout 1
pid 30011 had bailout 1
pid 30013 had bailout 1
pid 30009 had bailout 1
pid 30014 setting bailout 1
pid 30015 had bailout 1
pid 30010 had bailout 1
pid 30011 had bailout 1
1 * 0.494123 * 0.0704172 * 0 * 0.10829 * 0 * 0.465238 * 0 * 0.0638724 * 0 * 0 * 0 * 0.227231 * 0 * 0 * 0 * 0 * 0 * 0 * 0.463628 * 0.372984 = 0

发生的情况是 multiprocessing.Pool() 正在启动 4 个进程,这些进程在可用时会被重新使用。因此,在处理 runtups 中的 20 个项目时,最终每个进程的 bailout 设置为 1。当该进程被重用时,它会触发 bailout 子句。

由于您是随机决定何时设置 bailout = 1,因此在处理 20 个项目时,它可能永远不会发生,或者可能会在某些进程中发生,但在其他进程中不会发生,因此您可以没有得到与我上面粘贴的相同的结果,但至少某些进程可能会进入救助模式。

如果您正在寻找一种在进程之间共享状态的可靠方法,请查看 https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes .

关于python - 通过全局标志变量进行进程间信号传输的 python 多处理安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47863095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com