在socketserver handle()中维护连接而不轮询

2024-05-19 10:54:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找与pythonsocketserver保持连接的方法。我想避免以下情况。在

轮询输入

示例:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            message = self.rfile.readline().strip()
            ... do something with message

我要做的就是不断检查是否收到了什么。我想避免这种情况,因为服务器运行在Raspberry pi上,所以我希望尽可能减少不必要的计算。在


更新:2013年3月28日

看来接收插座()是阻塞呼叫。根据socketserver的文档:

The difference is that the readline() call in the second handler will call recv() multiple times until it encounters a newline character, while the single recv() call in the first handler will just return what has been sent from the client in one sendall() call.

也就是说如果接收插座()是一个阻塞调用,那么while True不会导致持续检查是否有新消息到达,也不会像我最初想的那样消耗处理器。在


每条消息一个连接

示例:

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

我以前问过一个类似的question,但是这个问题总结了前一个问题中没有直接涉及的问题的本质。在


Tags: theselftrue消息示例messagereadlinedef
1条回答
网友
1楼 · 发布于 2024-05-19 10:54:42

为了我自己的利益,我继续实施了一个版本。在

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)

相关问题 更多 >

    热门问题