0

投稿リクエストを処理するpython baseHTTPServerサーバーがあります。私は ThreadingMixIn を使用し、接続ごとにスレッドを開くようになりました。次のようないくつかのマルチスレッド アクションを実行したいと考えています。そのためにはロックが必要です。私のカウンターは、同じファイルのグローバル スコープにあります。どうやってやるの?2. ある種のキューを処理し、それをファイルに書き込みたいと考えています。キューの内容は、さまざまなスレッドから書き込まれた文字列のセットであり、ログの問題に関する情報を送信するだけです。どうすればそれができますか?do_POST(..) メソッドを使用するたびに、既に別のスレッドにいるため、スレッド化は「舞台裏で」行われるため、それを達成できません。

Succcessful_Logins = 0
Failed_Logins = 0
LogsFile = open(logfile)

class httpHandler(BaseHTTPRequestHandler):

    def do_POST(self):
       ..

class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
    pass

server = ThreadingHTTPServer(('localhost', PORT_NUMBER), httpHandler)
server.serve_forever()

これは私のサーバーの小さな壊れ物です。私を悩ませているもう1つのことは、最初に投稿応答をクライアントに送り返したいという顔です。その後、ロックメカニズムなどのために遅延する可能性があります。

4

1 に答える 1

0

あなたのコードから、新しい httpHandler が各スレッドで構築されているように見えますか? その場合は、次のようにカウントにクラス変数を使用し、ミューテックスを使用してカウントを保護できます。

class httpHandler(...):
    # Note that these are class variables and are therefore accessable
    # to all instances
    numSuccess = 0
    numSuccessLock = new threading.Lock()

    def do_POST(self):
        self.numSuccessLock.aquire()
        self.numSuccess += 1
        self.numSuccessLock.release()

異なるスレッドからのファイルへの書き込みに関しては、いくつかのオプションがあります。

  1. ロギング モジュールを使用します。http://docs.python.org/2/library/logging.html#thread-safetyから
  2. 上記のように Lock オブジェクトを使用して、ファイルへの書き込みをシリアル化します
  3. スレッド セーフ キューを使用して書き込みをキューに入れ、キューから読み取り、別のスレッドからファイルに書き込みます。例については、 http://docs.python.org/2/library/queue.html#module-Queueを参照してください。
于 2013-08-16T19:00:18.020 に答える