Python Socket Получение Сброс соединения

1

Я создал потоковый прослушиватель сокетов, в котором хранятся вновь принятые соединения в очереди. Затем потоки сокетов считываются из очереди и отвечают. По какой-то причине при проведении бенчмаркинга с помощью "ab" (тест apache) с использованием concurrency из 2 или более, я всегда получаю соединение reset, прежде чем он сможет завершить тест (это происходит локально, поэтому нет проблема с внешним подключением).

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

  • 0
    Как насчет публикации трассировки - для начала будет указано, где именно соединение было обнаружено как сбрасываемое.
  • 1
    Ошибка происходит на стороне клиента (в тесте apache - «apr_socket_connect (): сброс соединения по peer (54)»), сервер продолжает работать без инцидентов.
Теги:
multithreading
sockets

1 ответ

0

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

  • 0
    BaseHTTPServer не является многопоточным, и SocketServer не дает вам возможности делать такие вещи, как пул потоков.
  • 0
    Вы можете использовать SocketServer.ThreadingTcpServer для записи многопоточного HTTP-сервера. Для примера см .: stackoverflow.com/questions/2274320/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню