如何使用Python多处理类?

时间:2013-04-26 20:31:38

标签: python file class multiprocessing

这是一些示例代码,它读取文件并将每行添加起来。它应该加起来0-20的所有数字。但是,我总是得到0的结果。

我可以看到中间计算成功,为什么最终结果为0

有更好的方法吗?我正在尝试对更大,更复杂的输入文件进行更多计算,并在我去的时候存储一些统计信息。

import multiprocessing
import StringIO

class Total():
    def __init__(self):
        self.total = 0

    def add(self, number):
        self.total += int(number)

    def __str__(self):
        return str(self.total)

total = Total()

def f(input):
    total.add(input)

# Create mock file
mock_file = StringIO.StringIO()
for i in range(20):
    mock_file.write("{}\n".format(i))
mock_file.seek(0)

# Compute
pool = multiprocessing.Pool(processes=4)
pool.map(f, mock_file)

print total

# Cleanup
mock_file.close()

2 个答案:

答案 0 :(得分:3)

您可以使用shared memorysubprocess.Value完成此操作,只需将Total课程更改为以下内容:

class Total():
    def __init__(self):
        self.total = multiprocessing.Value('d', 0)

    def add(self, number):
        self.total.value += int(number)

    def __str__(self):
        return str(self.total.value)

答案 1 :(得分:2)

每个调用f的子流程都会更新自己的total副本,因此主流程total不受影响。

您可以让每个子进程返回其计算结果(在您的模拟示例中,这只是输入,未更改),然后在主进程中累积它。 E.g:

def f(input):
  return input

results = pool.map(f, mock_file)
for res in results:
  total.add(res)