Python socketserver との接続を維持する方法を探しています。次のような事態は避けたい。
入力のポーリング
例:
class SingleTCPHandler(SocketServer.StreamRequestHandler):
def handle(self):
while True:
message = self.rfile.readline().strip()
... do something with message
私がやっていることは、何かが受信されたかどうかを継続的にチェックすることです。サーバーはRaspberry piで実行されているため、これを避けたいので、不要な計算を最小限に抑えたいと考えています。
更新: 2013 年 3 月 28 日
socket.recv() はブロッキング呼び出しのようです。socketserverのドキュメントによると:
違いは、2 番目のハンドラーの readline() 呼び出しは、改行文字に遭遇するまで recv() を複数回呼び出すのに対し、最初のハンドラーの 1 回の recv() 呼び出しは、クライアントから送信されたものを 1 回で返すことです。 sendall() 呼び出し。
つまり、socket.recv() がブロッキング呼び出しであるwhile True
場合、新しいメッセージが到着したかどうかを常にチェックすることはなく、最初に考えたようにプロセッサを消費しません。
メッセージごとに 1 つの接続
例:
class SingleTCPHandler(SocketServer.StreamRequestHandler):
def handle(self):
while True:
message = self.rfile.readline().strip()
... do something with message
これにより、メッセージが受信されると接続が閉じられます。ただし、メッセージは 60 ミリ秒ごとに送信されるため、クライアントは毎回新しい接続を初期化します。これは、可能な限り高速である必要がある接続にオーバーヘッドをもたらします。
質問
メッセージが受信されるたびに何らかの「中断」を取得する方法はありますか?
(概念) 例:
class SingleTCPHandler(SocketServer.StreamRequestHandler):
def handle(self):
if interrupt:
message = self.rfile.readline().strip()
... do something with message
以前にも同様の質問をしましたが、この質問は前者の質問では直接的にアプローチできなかった問題の本質を要約しています。