【问题标题】:Python: How to modify a global variable in a function using pprocessPython:如何使用 pprocess 修改函数中的全局变量
【发布时间】:2012-09-27 13:15:46
【问题描述】:

使用从 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 循环调用函数时,全局变量会发生变化。

我花了一些时间阅读有关全局变量的信息,并真诚地希望这不是一个小问题。谁能给我解释一下这是怎么回事?

非常感谢,

恩诺

【问题讨论】:

  • 另请注意,此处不需要 global 关键字。即使你没有将它定义为全局对象,Python 也会很高兴地改变一个全局对象。如果您通过赋值更改变量引用的对象,则只需要global

标签: python function parallel-processing global-variables


【解决方案1】:

我的理解是pprocess 在后台使用subprocessing。如果是这种情况,那么每次运行该函数时,它实际上都是一个单独的进程。因此,当您的函数返回时,这些更改不会显示出来。

您可能需要将列表设为multiprocessing.Manager

例如

numbers = multiprocessing.Manager().list([0]*10)

【讨论】:

  • 感谢您的回复。我想实现这一点超出了我的编程能力,所以我现在通过将数据写入磁盘并稍后再读回它们来绕道(幸运的是这不会造成瓶颈)。
【解决方案2】:

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

您必须通过管道或pprocess 提供的任何东西或套接字等明确地在两者之间进行所有通信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多