1

这是一些读取文件并将每一行相加的示例代码。它应该将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()
4

2 回答 2

3

您可以使用共享内存来完成此操作subprocess.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)
于 2013-04-26T20:44:39.640 回答
2

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

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

def f(input):
  return input

results = pool.map(f, mock_file)
for res in results:
  total.add(res)
于 2013-04-26T20:44:27.380 回答