2016-09-23 23 views
0

私のコードで説明できない動作があります。私は出力がPythonマルチプロセッシングのロックの異常な動作

melon 
orange 
apple 
melon 

であろうと期待し

import multiprocessing 
from collections import deque 

LOCK = multiprocessing.Lock() 

data = deque(['apple', 'orange', 'melon']) 

def f(*args): 
    with LOCK: 
     data.rotate() 
     print data[0] 

pool = multiprocessing.Pool() 
pool.map(f, range(4)) 

ではなく、私は

melon 
melon 
melon 

を取得する任意のアイデアをいただければ幸いです。これは、コードです。

+0

「ロック」とは関係ありません。 Linux-yシステム上の各ワーカープロセスは、 'Pool'が作成されるときに、メインプロセスのアドレス空間(' fork() 'で読み込まれる)の_copy_を継承します。彼らはそれぞれ独自の 'data'のコピーを手に入れ、そのコピーに対するプロセスは他のプロセスのコピーに何の影響も与えません。 –

+0

私は見る...ありがとう! – giorgosp

答えて

1

Tim Petersがコメントしたように、問題はLockではありませんが、dequeはプロセス間で共有されず、すべてのプロセスが独自のコピーを持つことになります。

multiprocessingモジュールによって提供されるいくつかのデータ構造がプロセス間で共有されます。 multiprocessing.Queue。その代わりに使用してください。

+0

私はマルチプロセッシングと考えています.Queueはプロセス間通信に適しています。私が達成したいのは、メモリ内のデータベースとして機能するために、共有メモリ内のリストを持つことです。より良い解決策は、[プロセス間の共有状態](https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes)ドキュメントにあります。 – giorgosp

関連する問題