Python:如何使用pprocess在函数中修改全局变量

4

当我使用从pprocess调用的函数时,似乎无法修改Python中的全局变量。以下是我的示例:

import pprocess
import time

numbers=[0,0,0,0,0,0,0,0,0,0]

# find system time and store in global variable
def find_time(index):
    global numbers
    x=time.time()
    print "Setting element %s of numbers to %f" % (index, x)
    numbers[index]=x
    return x

# parallel execution of the function
results=pprocess.pmap(find_time, [0,1,2,3,4,5,6,7,8,9], limit=6)

for y in results:
    print '%f' % y

# this list is unchanged
print numbers

# serial execution of the function
for x in [0,1,2,3,4,5,6,7,8,9]:
    find_time(x)

# now it seems to work
print numbers

“numbers”只是一个零的列表,为了演示,我试图将每个列表元素设置为当前系统时间。当使用pprocess调用时,这不起作用,但当我使用简单的for循环调用函数时,全局变量就会改变。
我花了一些时间阅读关于全局变量的内容,并真诚地希望这不是一个琐碎的问题。有人能向我解释一下发生了什么吗?
非常感谢,
Enno

还要注意的是,在那里不需要使用global关键字。即使你没有将其定义为全局变量,Python也可以轻松地改变全局对象。只有在通过赋值更改变量引用的对象时才需要使用global关键字。 - mgilson
2个回答

1
我的理解是pprocess在底层使用subprocessing。如果是这样,那么每次运行函数时,它实际上是一个单独的进程。所以,当您的函数返回时,这些更改不会显示出来。
您可能需要将列表设置为multiprocessing.Manager
例如:
numbers = multiprocessing.Manager().list([0]*10)

谢谢您的回复。我想实现这个可能超出了我的编程能力,所以我现在通过将数据写入磁盘并稍后读取它们来创建一个绕路(幸运的是,这不会造成瓶颈)。 - mcenno

0

pprocess 创建另一个进程。这意味着它不与调用代码共享内存。并行进程修改的任何内容都将在其自己的内存空间中修改,因此调用代码的内存空间将保持不变。也就是说,它们不共享全局变量。

您必须通过管道或 pprocess 提供的其他方式(如套接字等)显式地在两者之间进行所有通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接