我创建了一个线程套接字侦听器,用于在队列中存储新接受的连接。然后套接字线程从队列中读取并响应。出于某种原因,当使用2或更高的并发性使用'ab'(apache基准测试)进行基准测试时,我总是在能够完成基准测试之前获得连接重置(这是在本地进行的,所以没有外部连接问题)
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)
。因为我使用了更高并发性(5及更高版本)的apache基准测试,导致连接积压堆积,此时连接开始被套接字丢弃。
答案 0 :(得分:0)
你有没有理由不使用Python附带的SocketServer?这样可以更好地处理这种情况。如果您正在寻找HTTP内容,BaseHTTPServer也为此提供了框架。