1

リスト 'tests1'と 'tests2'にデータを追加する次のスニペットを実行しようとしています。しかし、 'tests1'と 'tests2'を印刷すると、表示されるリストは空になります。何かここで間違っている?2つのループを並列化しているときに値を取得できません

tests1 = [] 
tests2 = [] 

def func1(): 
    for i in range(25,26): 
     tests1.append(test_loader.get_tests(test_prefix=new_paths[i],tags=params.get('tags', None), 
            exclude=params.get('exclude', False))) 

def func2(): 
    for i in range(26,27): 
     tests2.append(test_loader.get_tests(test_prefix=new_paths[i],tags=params.get('tags', None), 
            exclude=params.get('exclude', False))) 


p1 = mp.Process(target=func1) 
p2 = mp.Process(target=func2) 

p1.start() 
p2.start() 
p1.join() 
p2.join() 

print tests1 
print tests2 

答えて

0

ワーカープロセスは実際には同じオブジェクトを共有しません。それはコピーされる(漬け込まれる)。

multiprocessing.Queue(または他のさまざまな手段)を使用してプロセス間で値を送信できます。私の簡単な例を見てください(簡単にするためにテストを整数にしました)。

from multiprocessing import Process, Queue 

def add_tests1(queue): 
    for i in range(10): 
     queue.put(i) 
    queue.put(None) 

def add_tests2(queue): 
    for i in range(100,110): 
     queue.put(i) 
    queue.put(None) 

def run_tests(queue): 
    while True: 
     test = queue.get() 
     if test is None: 
      break 
     print test 

if __name__ == '__main__': 
    queue1 = Queue() 
    queue2 = Queue() 

    add_1 = Process(target = add_tests1, args = (queue1,)) 
    add_2 = Process(target = add_tests2, args = (queue2,)) 
    run_1 = Process(target = run_tests, args = (queue1,)) 
    run_2 = Process(target = run_tests, args = (queue2,)) 

    add_1.start(); add_2.start(); run_1.start(); run_2.start() 
    add_1.join(); add_2.join(); run_1.join(); run_2.join() 

親プログラムはキューにアクセスすることもできます。

+0

このエラーは以下のようになります:トレースバック(最新のコールが最後): ファイル "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/queues.py"、行_buildin __。instancemethod failed – Aditya

+0

@Adityaこれは、キューに追加するオブジェクトをpicklingしてunpicklingして、プロセス間でそれらを送信することによって機能します。 。 Pickleは機能を受け付けません。メソッドの代わりにオブジェクト全体を渡すこともできますが、確かに言うことのできない 'test_loader.get_tests'の詳細を知らなくても可能です。私の単純な例では、クラスに整数をラップし、動作するクラスインスタンスを返す場合ですが、インスタンスメソッドを返信すると、それと同じようなエラーで失敗します。 – aes

関連する問題