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

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 に答える