2

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

以前にも同様の質問をしましたが、この質問は前者の質問では直接的にアプローチできなかった問題の本質を要約しています。

4

1 に答える 1

2

私は先に進み、自分の利益のためにバージョンを実装しました。

import asyncore, socket, time, signal, sys

finished = None

class EchoHandler(asyncore.dispatcher_with_send):

    def handle_read(self):
        data = self.recv(8192)
        if data:
            self.send(data)

    def handle_close(self):
        print 'Closing connection from %s' % repr(self.getpeername())
        self.close()

class Listner(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)
        self.number_accepted = 1

    def handle_accept(self):
        pair = self.accept()
        if pair is not None:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = EchoHandler(sock)
            self.number_accepted-=1
        if self.number_accepted < 0:
            finished = 1

client = Listner('127.0.0.1', 1033)
asyncore.loop()

while not finished:
    time.sleep(1)
于 2013-03-27T16:21:26.057 に答える