17

次のコードが原因で散発的にクラッシュする urllib2 キャッシュ モジュールがあります。

if not os.path.exists(self.cache_location):
    os.mkdir(self.cache_location)

問題は、2 行目が実行されるまでに、フォルダーが存在する可能性があり、エラーが発生することです。

  ファイル ".../cache.py"、103 行目、__init__ 内
    os.mkdir(self.cache_location)
OSError: [Errno 17] ファイルが存在します: '/tmp/examplecachedir/'

これは、私が制御できないサードパーティのコードによって、スクリプトが同時に何度も起動されるためです。

(バグを修正しようとする前の) コードは、こちらの github にあります。

tempfile.mkstempは使用できません。これは、キャッシュの目的を無効にするランダムな名前のディレクトリ ( tempfile.py source here ) を使用して競合状態を解決するためです。

フォルダー名がファイルとして存在する場合 (別のエラー)、同じエラー Errno 17 エラーが発生するため、単純にエラーを破棄したくありません。次に例を示します。

$タッチ何とか
$パイソン
>>> OSをインポート
>>> os.mkdir("何とか")
トレースバック (最新の呼び出しが最後):
  ファイル ""、1 行目、
OSError: [Errno 17] ファイルが存在します: '何とか'
>>>

threading.RLockコードが複数のプロセスから呼び出されるため、使用できません。

それで、私は単純なファイルベースのロックを書いてみました(そのバージョンはここにあります)が、これには問題があります.1レベル上のロックファイルを作成するため/tmp/example.lock、キャッシュディレクトリとして/tmp/example/使用すると壊れます(しようとして/tmp/作る/tmp.lock)。

つまり、urllib2応答をディスクにキャッシュする必要があります。これを行うには、マルチプロセスの安全な方法で既知のディレクトリにアクセスする必要があります (必要に応じてディレクトリを作成します)。OS X、Linux、および Windows で動作する必要があります。

考え?私が考えることができる唯一の代替ソリューションは、ファイルではなく SQLite3 ストレージを使用してキャッシュ モジュールを書き直すことです。

4

5 に答える 5

1

競合状態が頻繁に発生する場合、EAFP (許可よりも許しを求めるほうが簡単) は LBYL (跳躍する前に見る) よりもうまく機能します。

エラー チェック戦略

于 2009-10-19T02:49:29.493 に答える