2010-03-09 2 views
1

Я создал прослушиватель сокетов, который хранит вновь принятые соединения в очереди. Затем потоки сокетов считываются из очереди и отвечают. По какой-то причине, когда вы проводите бенчмаркинг с помощью «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 и выше), он заставлял накопившиеся соединения накапливаться, и в этот момент соединения начали снижаться сокетом.

+0

Как насчет отправки трассировки - он точно скажет, где соединение было обнаружено как получение сброса, для начала. – Kylotan

+1

Ошибка происходит на стороне клиента (в тесте apache - «apr_socket_connect():« Сброс соединения с помощью peer (54) »), сервер продолжает работать без инцидентов. – Ian

ответ

0

Есть ли причина, по которой вы не используете SocketServer, который поставляется с Python? Это значительно улучшило бы ситуацию. Если вы хотите использовать HTTP-материал, BaseHTTPServer также обеспечивает основу для этого.

+0

BaseHTTPServer не имеет резьбы, и SocketServer не дает вам возможности делать такие вещи, как объединение потоков. – Ian

+0

Вы можете использовать SocketServer.ThreadingTcpServer для записи многопоточного HTTP-сервера. Пример: http://stackoverflow.com/questions/2274320/socketserver-threadingtcpserver-cannot-bind-to-address-after-program-restart –

Смежные вопросы