2

Webサービスリクエストワークスペースを監視しているPythonスクリプトがあります。クライアントが私のWebサービスにジョブを送信するたびに、よく知られた場所に一意のジョブフォルダーが作成されます。「フラグ」(このジョブの処理が完了したことを示す特定の名前の空白のテキストファイル)のないフォルダーのこのよく知られた場所をポーリングするスクリプトがあります。

現在、私のスクリプトはワーカースクリプトを呼び出して新しいフォルダーの内容を処理できますが、ワーカースクリプトが終了するまで待ってから、フォルダーの配布を続行する必要があります。

私の質問は、ワーカースクリプトの新しいインスタンスをインスタンス化して、制御をマネージャーに戻すためのオプションは何ですか。ワーカースクリプトのパラメーターを受け取り、マネージャースクリプトでコマンドラインから呼び出すPython実行可能ファイルを作成しますか?または、多数のインステーション処理作業を行うことができるクラスにワーカースクリプトを作成しますか?

ワーカースクリプトが完了すると、マネージャースクリプトジョブの完了にメッセージを返す必要はありません。これは、テキストファイルをディレクトリにドロップすることで実行されます。今考えてみると、ワーカースクリプトの処理に1.5分かかるため、各ジョブディレクトリが配布されていることをどこかで保持する必要があります。

アドバイス/リンクをいただければ幸いです。

4

1 に答える 1

0

まず、ディレクトリが処理中であることを示すフラグをディレクトリに配置する必要があることに同意します。フラグを設定するのはマスタースクリプトだけである必要があります。そうしないと、競合状態のリスクがあります(2つのワーカースクリプトが同時に同じディレクトリを使用します)。同じファイルを使用できます。マスタースクリプトはそれを空にし(「進行中」を意味します)、ワーカースクリプトはそれに1Bを書き込みます(「完了」を意味します)。そうすれば、マスタースクリプトはフラグの存在をチェックするだけで済みます。

あなたの質問に戻る:

  • 実際、ワーカースクリプトをスタンドアロンプ​​ログラムにして、 subprocessモジュールを介して呼び出すことができます。

  • threading(モジュール[2]を使用して)スレッドにすることができます。これは、コーディングがいくらか簡単です。これは GILのために非効率的かもしれませんが、ワーカースクリプトが高度にIOバウンドである場合は、それほど問題にはならないはずです。

  • Python 3を使用している場合は、私が使用したことの ないmultiprocessingモジュール[3]
    を確認することをお勧めしますが、GILに対して脆弱ではなく、スレッドの使いやすさを兼ね備えているようです。ただし、完全に移植できるわけではないようです。

お役に立てれば

  • [1]http://docs.python.org/library/subprocess.html
  • [2]http://docs.python.org/library/threading.html
  • [3]http://docs.python.org/dev/library/multiprocessing.html
于 2012-04-10T15:18:00.707 に答える