Python 在socketserver句柄()中维护连接而不轮询
我正在寻找一种与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
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)
看一下: