レースの条件をフォルダにPython
-
22-09-2019 - |
質問
いurllib2キャッシュのモジュールは、散発的事故では、次のコード:
if not os.path.exists(self.cache_location):
os.mkdir(self.cache_location)
問題は、時間のラインが実行され、フォルダが存在し、エラー:
File ".../cache.py", line 103, in __init__ os.mkdir(self.cache_location) OSError: [Errno 17] File exists: '/tmp/examplecachedir/'
これは、スクリプトを同時に開始となく、第三者コードを管理します。
このコード前しようとすると不具合を修正することができます。 ここでは、github
利用できないの tempfile.mkstemp, として解決のレースの条件をランダムにファイル名を明示的に指定(tempfile.py 出典ではないことに敗戦の目的ます。
ならないようにしたいで廃棄し、エラーのエラー Errno17きなければ、フォルダ名として存在するファイルを別のエラー)は、例えば:
$ touch blah $ python >>> import os >>> os.mkdir("blah") Traceback (most recent call last): File "", line 1, in OSError: [Errno 17] File exists: 'blah' >>>
利用できません threading.RLock
としてのコードであれば複数のプロセス。
そこで、私た書簡単にファイルに基づくロックそのバージョンはこちらが、この問題:で、lockfile一レベルで /tmp/example.lock
のための /tmp/example/
, は、休憩をご利用の場合 /tmp/
としてのキャッシュdirてことで /tmp.lock
)..
短いながらプレーする必要がありまキャッシュ urllib2
対応ディスクです。このためには、アクセスする必要のあ知られるディレクトリを作成し、必要な場合)、multiprocess安全です。協働することが不可欠だOS X、LinuxおよびWindowsの場合です。
思いの?の代替液を考えることができるのは書き換えのキャッシュを用いたモジュールSQLite3保存なファイルです。
解決
のPython 3.xでは、あなたはそのようなディレクトリが存在する場合は任意の例外を発生しませんos.makedirs(path, exists_ok=True)
を、使用することができます。ファイルが要求されたディレクトリ(FileExistsError: [Errno 17]
)と同じ名前で存在する場合、それはpath
を発生させます。
でそれを確認してください
import os
parent = os.path.dirname(__file__)
target = os.path.join(parent, 'target')
os.makedirs(target, exist_ok=True)
os.makedirs(target, exist_ok=True)
os.rmdir(target)
with open(target, 'w'):
pass
os.makedirs(target, exist_ok=True)
他のヒント
の代わりに
if not os.path.exists(self.cache_location):
os.mkdir(self.cache_location)
なにができる
try:
os.makedirs(self.cache_location)
except OSError:
pass
という同じ 機能.
免責事項:わからないのPythonicことなのかもしれません。
を使用 SQLite3
, が スタッフのお母さんを失わせないアイテムが追加され 多く 機能性と柔軟性を利用する。
だいくさんの"選択"同時挿入し、フィルタリングで使うようにするといいでしょう SQLite3
, は、そもそも太陽系つの追加も複雑で超簡単なファイル(こで削除します複雑性).
Rereadingご質問やコメントできるかで、より理解する問題です。
える可能性があ ファイル ることができ、同じレースですか?
が小さい場合は、その思いのようなもの:
if not os.path.isfile(self.cache_location):
try:
os.makedirs(self.cache_location)
except OSError:
pass
また、読書コードも変更
else:
# Our target dir is already a file, or different error,
# relay the error!
raise OSError(e)
へ
else:
# Our target dir is already a file, or different error,
# relay the error!
raise
しっかりしたい,Pythonをreraise同じ例外 (作品の講釈).
それともう一つは、 この などにも応用が可能であります(Unixいます。
だっます:
import os
import errno
folder_location = "/tmp/example_dir"
try:
os.mkdir(folder_location)
except OSError as e:
if e.errno == errno.EEXIST and os.path.isdir(folder_location):
# File exists, and it's a directory,
# another process beat us to creating this dir, that's OK.
pass
else:
# Our target dir exists as a file, or different error,
# reraise the error!
raise
あなたは例外とファイルがディレクトリとして存在するか否か、テストをキャッチしてもらえますか?
あなたは競合状態を持っている場合が多いEAFPは(簡単に許可よりも許しを依頼する)LBYL(あなたが飛躍する前に見て)
という良い作品