Я создал прослушиватель сокетов, который хранит вновь принятые соединения в очереди. Затем потоки сокетов считываются из очереди и отвечают. По какой-то причине, когда вы проводите бенчмаркинг с помощью «ab» (тест apache) с использованием параллелизма 2 или более, я всегда получаю сброс соединения, прежде чем он сможет завершить тест (это происходит локально, поэтому нет проблемы с внешним подключением) ,Сокет Python Получение Сброса Сброса
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.
Edit: Взял меня некоторое время, чтобы понять это, но проблема была в sock.listen(5)
. Поскольку я использовал тест apache с более высоким уровнем параллелизма (5 и выше), он заставлял накопившиеся соединения накапливаться, и в этот момент соединения начали снижаться сокетом.
Как насчет отправки трассировки - он точно скажет, где соединение было обнаружено как получение сброса, для начала. – Kylotan
Ошибка происходит на стороне клиента (в тесте apache - «apr_socket_connect():« Сброс соединения с помощью peer (54) »), сервер продолжает работать без инцидентов. – Ian