Python套接字连接被重置

1 投票
1 回答
2372 浏览
提问于 2025-04-15 20:13

我创建了一个多线程的套接字监听器,它会把新接受的连接存储在一个队列里。然后,套接字线程会从这个队列中读取连接并进行响应。但不知为什么,当我用'ab'(Apache基准测试工具)进行性能测试时,如果并发数是2或更多,我总是会在测试完成之前遇到连接重置的问题(这个测试是在本地进行的,所以没有外部连接的问题)。

class server:    
_ip = ''
_port = 8888

def __init__(self, ip=None, port=None):
    if ip is not None:
        self._ip    = ip
    if port is not None:
        self._port  = port
    self.server_listener(self._ip, self._port)

def now(self):
    return time.ctime(time.time())

def http_responder(self, conn, addr):
    httpobj = http_builder()
    httpobj.header('HTTP/1.1 200 OK')
    httpobj.header('Content-Type: text/html; charset=UTF-8')
    httpobj.header('Connection: close')
    httpobj.body("Everything looks good")        
    data = httpobj.generate()

    sent = conn.sendall(data)


def http_thread(self, id):        
    self.log("THREAD %d: Starting Up..." % id)

    while True: 
        conn, addr = self.q.get()
        ip, port = addr
        self.log("THREAD %d: responding to request: %s:%s - %s" % (id, ip, port, self.now()))
        self.http_responder(conn, addr)                
        self.q.task_done()
        conn.close()

def server_listener(self, host, port):
    self.q = Queue.Queue(0)

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind( (host, port) )
    sock.listen(5)


    for i in xrange(4): #thread count
        thread.start_new(self.http_thread, (i+1, ))

    while True:
        self.q.put(sock.accept())

    sock.close()

server('', 9999)

在运行基准测试时,我得到的有效请求数量完全是随机的,通常在4到500之间。

补充:我花了一段时间才搞明白,问题出在sock.listen(5)上。因为我用的Apache基准测试工具的并发数比较高(5及以上),这导致连接的积压,结果就开始出现连接被丢弃的情况。

1 个回答

0

你有没有想过为什么不使用Python自带的SocketServer呢?这个工具能更好地处理你的情况。如果你想做一些HTTP相关的事情,BaseHTTPServer也提供了一个框架来帮助你实现。

撰写回答