PythonのRequestHandler Handlerインスタンス内からSocketServerサーバーインスタンスの変数を変更するにはどうすればよいですか?
-
28-09-2019 - |
質問
これが問題のコードです:
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
に続く True
初めて、そして True
に続く True
今後。
サーバーインスタンスの変数に変更した変更が、ハンドラーの範囲外に持続しないのはなぜですか 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()
まだ機能しません。つまり、以前と同じ出力を生成します。誰かが私がどこにいて間違っているのか教えてもらえますか?
解決
フォーキングは新しいプロセスを作成するため、元のプロセスでサーバーの変数を変更することはできません。代わりに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()
他のヒント
あなたの問題は、socketserver.forkingmixinがすべての要求に合わせて新しいプロセスを作成することです。したがって、すべての変数がデフォルトの状態にリセットされるたびに、新しいリクエストがすべての変数に登場するたびに。したがって、本質的には、self.server.loadedに何を割り当てても、次のリクエストでリセットされます。これがグローバルが機能しない理由でもあります。
リクエスト間で持続するために変数が必要な場合は、そのデータをどこかに書くのが最適です。ER、永続的=)。基本的に、セッション変数を維持する問題を解決しようとしているように聞こえます。それを行う方法は100万あり、あなたの状況に応じて、ある方法は別の方法よりも適切であるかもしれません。他のPythonベースのSocketServerアプリケーションがどのように行うかを検討することを強くお勧めします。
「FileType:Py SocketServer ForkingMixin」(最初の結果の1つはCherrypyで、これを強くお勧めします)。