2016-08-23 10 views
0

異なるスレッドからグローバルdictにアクセスしようとしています。完全な例は以下の通りです:グローバルオブジェクトをPythonスレッド/プロセスから更新する

results = {0: 'pass'} 

def checkResult(thread_num, result_map): 
    while(True): 
     results[thread_num] = 'fail' 
     print('Thread results : '+str(results)) 
     time.sleep(5) 

multiprocessing.Process(target = checkResult, args=(1, results)).start() 
multiprocessing.Process(target = checkResult, args=(2, results)).start() 

while(True): 
    print('Main results: '+str(results)) 
    time.sleep(3) 

「主な結果」だけのスレッド0を見て、「スレッドの結果が」唯一、自分のスレッドの結果ごとに辞書を変更します。

Thread results : {0: 'pass', 1: 'fail'} 
Main results: {0: 'pass'} 
Thread results : {0: 'pass', 2: 'fail'} 
Main results: {0: 'pass'} 
Thread results : {0: 'pass', 1: 'fail'} 
Thread results : {0: 'pass', 2: 'fail'} 
Main results: {0: 'pass'} 
^C 

それはと思われます「結果」マップは参照渡しではなく値渡しされています。各スレッドが独自のコピーを使用する代わりに、スレッドが元のグローバルマップを参照する方法はありますか?

私は、あるスレッドが別のスレッドの変更を上書きする問題を避けるためにロックを使用するべきであることを知っています(実際の解決策ではそうする予定です)。現時点では、私はすべてのスレッドを共通の結果辞書で処理しようとしています。

+0

:このような

何かがトリックを行う必要があります。 – syntonym

+0

[これを確認する](http://stackoverflow.com/questions/10797998/is-it-possible-to-multiprocess-a-function-that-returns-something-in-python)答え、結果を渡す方法を説明していますサブプロセスから戻る。 – FujiApple

答えて

1

プロセスの代わりにスレッドを使用して実行できるグローバルオブジェクトへの並列アクセスが必要です。すべてのスレッドは同じアドレス空間を共有します。つまり、同じレフェラルにアクセスできます。 (整数キーでdictを使用する代わりに、リストを使用することもできます)

一意の「スレッド番号」を使用している場合は、実際に競合状態を心配する必要はありません。それは自分のインデックスです。あなたがスレッドを、複数のプロセスを使用していない

import _thread, time 

results = {0 : 'pass'} 

def checkResult(thread_num): 
    while True: 
     results[thread_num] = 'fail' 
     print('Thread results: ' + str(results)) 
     time.sleep(3) 

_thread.start_new_thread(checkResult, (1,)) 
_thread.start_new_thread(checkResult, (2,)) 

while True: 
    print('Main results: ' + str(results)) 
    time.sleep(3) 

thisはあなたを助けるかもしれない)

+0

ああ、それは完璧に動作します!私はスレッディングとマルチプロセッシングの違いを理解していませんでしたが、意味があります。 (そして「スレッド番号」のものは私の単純化された認識を超えた例の一部ですが、ヒントはありがたいです!) –

関連する問題