3

問題のコードは次のとおりです。

  class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
     __slots__ = ("loaded")

  class Handler(SocketServer.StreamRequestHandler):
     def handle(self):
        print self.server.loaded # Prints "False" at every call, why?
        self.server.loaded = True
        print self.server.loaded # Prints "True" at every call, obvious!

  server = Server(('localhost', port), Handler)
  server.loaded = False

  while True:
     server.handle_request()

新しいリクエストが来るたびに、得られる出力のFalse後にTrue. 私が欲しいものは、最初にFalse続き、その後に続きます。TrueTrueTrue

サーバー インスタンスの変数に加えた変更が、ハンドラーのhandle()関数の範囲外で持続しないのはなぜですか?

更新しました:

だから、私はグローバル変数を使って私が望むものを達成しようとします:

  loaded = False

  class Server(SocketServer.ForkingMixIn, SocketServer.TCPServer):
     pass

  class Handler(SocketServer.StreamRequestHandler):
     def handle(self):
        global loaded
        print loaded # Prints "False" at every call still, why?
        loaded = True
        print loaded # Prints "True" at every call, obvious!

  def main():
     server = Server(('localhost', 4444), Handler)
     global loaded
     loaded = False

     while True:
        server.handle_request()

  if (__name__ == '__main__'):
     main()

そして、それはまだ機能しません。つまり、以前と同じ出力が生成されます。誰かが私が間違っているところを教えてもらえますか?

4

2 に答える 2

4

フォークは新しいプロセスを作成するため、元のプロセスでサーバーの変数を変更することはできません。代わりにThreadingTCPServerを試してください。

import SocketServer

class Server(SocketServer.ThreadingTCPServer):
    __slots__ = ("loaded")

class Handler(SocketServer.StreamRequestHandler):
    def handle(self):
        self.server.loaded = not self.server.loaded
        print self.server.loaded # Alternates value at each new request now.

server = Server(('localhost',5000),Handler)
server.loaded = False

while True:
    server.handle_request()
于 2010-10-06T03:49:22.137 に答える
2

問題は、SocketServer.ForkingMixin がリクエストごとに新しいプロセスを作成することです。したがって、新しいリクエストが来るたびに、すべての変数がデフォルトの状態にリセットされます。したがって、基本的に self.server.loaded に何を割り当てても、次のリクエストでリセットされます。これが、グローバルが機能しない理由でもあります。

リクエスト間で永続化する変数が必要な場合は、そのデータを別の場所に書き込むのが最善です。つまり、persistent =)。基本的に、セッション変数を保持するという問題を解決しようとしているようです。それを行うには無数の方法があり、状況によっては、ある方法が別の方法よりも適切な場合があります。他の Python ベースの SocketServer アプリケーションがどのようにそれを行っているかを確認することを強くお勧めします。

「filetype:py SocketServer ForkingMixIn」(最初の結果の 1 つは CherryPy です。これを確認することを強くお勧めします)。

于 2010-10-06T01:52:42.760 に答える