python - 在套接字服务器句柄()中保持连接而不进行轮询

标签 python sockets events

我正在寻找一种方法来维持与 python 套接字服务器的连接。我想避免以下情况。

轮询输入

示例:

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 - 在套接字服务器句柄()中保持连接而不进行轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15660041/

相关文章:

python - 减少 Arduino 和 Python 串行通信时的延迟

actionscript-3 - 使用 AS3 ServerSocket 和 Socket 连接两个客户端

apache - Apache 中的快速 CGI : Couldn't bind unix domain socket

.net - 组合框在显示列表项时,如何将鼠标事件拦截到窗体上的任意位置以隐藏列表?

python - [Python/Tkinter]如何获取在函数 "event_generate"中设置的数据值

c# - 如何使用c#设置arcobjects中的输入和输出参数,调用python脚本?

python - 如果列表(a)中的项目存在于列表(b)中,则通过更大的列表(b)迭代列表(a)以给出真/假值

c# - 套接字无响应

java - 如何在 SpEL 中引用 ApplicationEventPublisher?

c++ - 设计最快的页面下载