6

したがって、私が最終的にやろうとしているのは、行を読み取り、その行の情報を使用して計算を行い、その結果をグローバルオブジェクトに追加することですが、それを機能させることはできません。たとえば、以下のコードでは、testは常に0です。私はこれが間違っていることを知っています、そして私はそれを他の方法でやろうとしました、しかしそれはまだ機能していません。

import multiprocessing as mp

File = 'HGDP_FinalReport_Forward.txt'
#short_file = open(File)
test = 0

def pro(temp_line):
    global test
    temp_line = temp_line.strip().split()
    test = test + 1
    return len(temp_line)

if __name__ == "__main__":
    with open("HGDP_FinalReport_Forward.txt") as lines:
        pool = mp.Pool(processes = 10)
        t = pool.map(pro,lines.readlines())
4

2 に答える 2

17

プールによって生成されたワーカープロセスは、グローバル変数の独自のコピーを取得して更新します。明示的に設定しない限り、メモリを共有しません。最も簡単な解決策は、たとえば戻り値を介して、の最終値をtestメインプロセスに戻すことです。(テストされていない)のようなもの:

def pro(temp_line):
    test = 0
    temp_line = temp_line.strip().split()
    test = test + 1
    return test, len(temp_line)

if __name__ == "__main__":
    with open("somefile.txt") as lines:
        pool = mp.Pool(processes = 10)
        tests_and_t = pool.map(pro,lines.readlines())
        tests, t = zip(*test_and_t)
        test = sum(tests)
于 2012-06-19T21:35:28.810 に答える
0

マルチプロセッシング内でグローバル変数を使用する例を次に示します。

各プロセスが独自の変数のコピーで機能することがはっきりとわかります。

import multiprocessing
import time
import os
import sys
import random
def worker(a):
    oldValue = get()
    set(random.randint(0, 100))
    sys.stderr.write(' '.join([str(os.getpid()), str(a), 'old:', str(oldValue), 'new:', str(get()), '\n']))

def get():
    global globalVariable
    return globalVariable

globalVariable = -1
def set(v):
    global globalVariable
    globalVariable = v

print get()
set(-2)
print get()

processPool = multiprocessing.Pool(5)
results = processPool.map(worker, range(15))

出力:

27094 0 old: -2 new: 2 
27094 1 old: 2 new: 95 
27094 2 old: 95 new: 20 
27094 3 old: 20 new: 54 
27098 4 old: -2 new: 80 
27098 6 old: 80 new: 62 
27095 5 old: -2 new: 100 
27094 7 old: 54 new: 23 
27098 8 old: 62 new: 67 
27098 10 old: 67 new: 22 
27098 11 old: 22 new: 85 
27095 9 old: 100 new: 32 
27094 12 old: 23 new: 65 
27098 13 old: 85 new: 60 
27095 14 old: 32 new: 71
于 2013-10-03T05:39:26.170 に答える