2016-04-14 9 views
1

私は並列処理で呼び出される関数myfuncを持っています。複数のプロセスで同じ宛先フォルダを共有すると、すべてがmyfuncと並行して呼び出され、宛先フォルダの存在が確認されます。すでに存在していれば問題ありません。しかし、スクリプトを起動する前にフォルダが存在しなかった場合、最初のプロセスはifブロックを入力してフォルダを作成します。一方、ブロックが「ほとんど」同時にブロックすると、同じプロセスに入り、フォルダが存在しないことがわかり、プロセスを作成しようとしますが、最初のプロセスでは実際にプロセスが作成されます。すでにそれを行っています。したがって、ある時点で、フォルダがすでに存在していることを示すOSErrorがあります。マルチプロセッシング中のファイルの存在を正しく確認しています

マルチプロセッシング中にこの問題に対処する明確な方法はありますか?私はプロセスを起動する前に、機能myfuncの外に目的地のフォルダを世話することを考えています。しかし、知識のために、マルチプロセッシングを使って解決策を見つけるのは良いことです。同時実行の問題を解決するためのthreadingモジュールから

import os, sys 

def myfunc(file_names, destination=None, file_permission=None, verbose=False): 
    absPath = os.path.abspath(file_names[0]) 
    baseName = os.path.basename(absPath) 
    dirName = os.path.dirname(absPath) 


    destination_folder = "/default/destination" if destination is None \ 
     else os.path.abspath(destination) 

    if not os.path.isdir(destination_folder): 
     os.mkdir(destination_folder) 
     os.chmod(destination_folder, file_permission) 
     if verbose: 
      print "Created directory", destination_folder 
+0

例外をキャッチしますか? – BlackBear

答えて

0

使用Lock

import os, sys 
from threading import Lock 

def myfunc(lock, ...): 
    ... do stuff as usual ... 

    with lock: 
     destination_folder = "/default/destination" if destination is None \ 
      else os.path.abspath(destination) 

    ... do everything else as usual ... 

if __name__ == "__main__": 
    my_lock = Lock() 
    myfunc(my_lock, ...) 
+1

''マルチプロセッシング '(タイトルごと)を使用する場合は、同等の '' multiprocessing.Lock''を使用します。 –

1

は、ファイル/フォルダの存在をチェックし、その結果に基づいて行動をとる場合でもので、ほとんどの場合、根本的に間違っていますあなたはマルチプロセッシングではありません、あなたは他のコンピュータ上で実行されているか分からない。もともと意図していなくても、他の誰かがプロセスの複数のコピーを後で実行しないことを保証することは困難です。

最も堅牢な方法は、常にフォルダを作成しようとしていて、「ただし、既に存在しています」というエラーを黙って無視することです。 (ただし、「あなたはその許可を持っていません」などの他のエラーは無視しないでください!)これは、マルチプロセッシングを開始する前に一度チェックしても、やはり最良の方法です。

+0

catchと例外とロックの組み合わせを使用するべきだと思いますか?私は実際にあなたとth3an0malyの間でどの答えが最も適切か分かりません。 – kaligne

+0

堅牢にするには、例外をキャッチする必要があります。一般的なケースでは、あなたのロックが完璧であっても、別のプログラムがあなたの下からファイルやフォルダを突然変更することがあります。これを実行したら、ロックや条件文を使用しても価値を付加するかどうかを評価できます。確かに便利な場所ですが、私はこれがその場所の一つだとは思わないのです。例外を捕捉すると、ロックは追加の安全性を提供せずにこのソリューションに複雑さを追加します。 – GrandOpener

関連する問題