1

何千ものファイルがあるディレクトリがあり、それぞれを(Pythonスクリプトで)処理してから削除する必要があります。

フォルダ内のファイルを読み取り、処理し、削除して別のファイルに移動するbashスクリプトを作成したいと思います。順序は重要ではありません。このbashスクリプトの実行中のインスタンスはn個(例:10)あり、すべて同じディレクトリで動作します。ディレクトリにファイルがなくなると、それらは終了します。

これにより競合状態が発生すると思います。2つのbashスクリプトが同じファイルで動作しないようにする方法についてアドバイス(またはコードスニペット)を教えてください。

または、(n個の異なるbashスクリプトを実行するのではなく)Pythonでマルチスレッドを実装する必要があると思いますか?

4

3 に答える 3

1

2つのスクリプトが同時に同じファイルに作用しない唯一の確実な方法は、ある種のファイルロックメカニズムを採用することです。これを行う簡単な方法は、ファイル名に既知の文字列を追加することにより、作業を開始する前にファイルの名前を変更することです。その後、作業が完了し、ファイルが削除されます。各スクリプトは、何かを行う前にファイル名をテストし、それが「特別」である場合は次に進みます。

より複雑なアプローチは、「処理中」のファイルの名前を含む一時ファイルを維持することです。すべてが終了したら、このファイルを削除する必要があることは明らかです。

于 2012-12-08T11:38:32.777 に答える
1

(同じファイルシステム上の)ファイルの名前変更がUnixシステムではアトミックであるという事実を使用できます。つまり、ファイルの名前が変更されたかどうかに関係なく使用できます。わかりやすくするために、処理する必要のあるすべてのファイルの名前がAで始まると仮定します(現在処理しているファイル用に別のフォルダーを用意することで、これを回避できます)。

次に、bashスクリプトはファイルを繰り返し処理し、ファイルの名前を変更しようとしますprocess。成功した場合はpythonスクリプト(ここではこれを呼び出します)を呼び出し、それ以外の場合は続行します。このような:

#!/bin/bash

for file in A*; do
    pfile=processing.$file
    if mv "$file" "$pfile"; then
       process "$pfile"
       rm "$pfile"
    fi
done

このスニペットはmv、ファイルを移動できた場合は0の終了コードを返し、それ以外の場合はゼロ以外の終了コードを返すという事実を使用します。

于 2012-12-08T11:51:38.570 に答える
0

あなたの問題の解決策は消費者生産者パターンだと思います。私はこの解決策が始める正しい方法だと思います:

Pythonマルチプロセッシングに関する生産者/消費者問題

于 2012-12-08T12:00:30.620 に答える