gpt4 book ai didi

python - 维护连接而不轮询socketserver handle()

转载 作者:行者123 更新时间:2023-12-03 11:53:15 25 4
gpt4 key购买 nike

我正在寻找一种与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的文档:

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.



这意味着,如果socket.recv()是一个阻塞调用,那么 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,但是这个问题总结了在前一个问题中没有直接解决的问题的本质。

最佳答案

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

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)

关于python - 维护连接而不轮询socketserver handle(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15660041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com