2016-10-20 21 views
4

ファンクションにセマフォを渡すことによって、複数のワーカー間で共有リソースへのアクセスをPython multiprocessing.Poolで同期したいと思います。ここにいくつかの疑似コードがあります。Pythonマルチプロセッシングを使用してファンクション付きセマフォを共有する

def do_work(payload, semaphore): 
    with semaphore: 
     access_the_shared_resource(payload) 

機能do_workは、私は機能が継承できるというのが私のローカルスコープでセマフォを定義することができないようなライブラリで定義されています。 multiprocessingは許可されていないセマフォをpickleしようとしているので、functools.partialを使ってセマフォを渡すこともできません。何がSemaphoreへのプロキシを作成するために、multiprocessing.Managerを使用して動作するようです:

manager = multiprocessing.Manager() 
semaphore = manager.Semaphore() 

with multiprocessing.Pool() as pool: 
    results = pool.map(functools.partial(do_work, semaphore=semaphore), payloads) 

が、これが最善のアプローチですか、私は明白な解決策をしないのですか?

答えて

0

あなたの唯一のオプションは、プールの作成時に各ワーカー・プロセスに定期的multiprocessing.Semaphoreを渡すためにinitializerinitargsを使用して、グローバル変数としてそれを使用することです:あなたが定義するグローバルsemaphore変数を

semaphore = None 
def do_work(payload): 
    with semaphore: 
     return payload 

def init(sem): 
    global semaphore 
    semaphore = sem 

if __name__ == "__main__": 
    sem = multiprocessing.Semaphore() 
    with multiprocessing.Pool(initializer=init, initargs=(sem,)) as p: 
     results = p.map(do_work, payloads) 

親は各子プロセスのmultiprocessing.Semaphore()に設定されます。

manager.Semaphore()を使用しても問題ありませんが、余分なPythonプロセスを生成する必要があります。

関連する問題