Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在socketserver句柄()中维护连接而不轮询_Python_Sockets_Events - Fatal编程技术网

Python 在socketserver句柄()中维护连接而不轮询

Python 在socketserver句柄()中维护连接而不轮询,python,sockets,events,Python,Sockets,Events,我正在寻找一种与python socketserver保持联系的方法。我想避免以下情况 轮询输入 例如: class SingleTCPHandler(SocketServer.StreamRequestHandler): def handle(self): while True: message = self.rfile.readline().strip() ... do something with message c

我正在寻找一种与python socketserver保持联系的方法。我想避免以下情况

轮询输入

例如:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            message = self.rfile.readline().strip()
            ... do something with message
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()是一个阻塞调用。根据以下文件:

不同之处在于,第二个处理程序中的readline()调用将 多次调用recv(),直到遇到换行符, 而第一个处理程序中的单个recv()调用只会返回 在一次sendall()调用中从客户端发送的内容

这意味着,如果socket.recv()是一个阻塞调用,那么
while True
不会导致不断检查是否有新消息到达,也不会像我最初认为的那样消耗处理器


每条消息一个连接

例如:

class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            message = self.rfile.readline().strip()
            ... do something with message
class SingleTCPHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        while True:
            message = self.rfile.readline().strip()
            ... do something with message
这将在收到消息后关闭连接。但是,消息每60毫秒发送一次,因此客户端每次都会初始化一个新连接。这会给连接带来开销,连接速度应尽可能快

问题

是否有一种方法可以在每次收到消息时获得某种“中断”

(概念)示例:


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

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

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)
导入异步内核、套接字、时间、信号、系统
完成=无
类EchoHandler(asyncore.dispatcher\u和\u send):
def句柄读取(自):
数据=self.recv(8192)
如果数据:
self.send(数据)
def手柄_关闭(自身):
打印“正在关闭来自%s“%repr(self.getpeername())的连接”
self.close()
类Listner(asyncore.dispatcher):
定义初始化(自身、主机、端口):
asyncore.dispatcher.\uuuuu init\uuuuu(self)
self.create\u套接字(socket.AF\u INET、socket.SOCK\u流)
self.set\u reuse\u addr()
self.bind((主机、端口))
听我说(5)
self.number_接受=1
def句柄_接受(自身):
pair=self.accept()
如果对不是无:
袜子,地址=对
打印“来自%s的传入连接”%repr(addr)
handler=EchoHandler(sock)
接受的自我编号\u-=1
如果接受的self.number_小于0:
完成=1
client=Listner('127.0.0.1',1033)
asyncore.loop()
未完成时:
时间。睡眠(1)
看一下: