Python потребляет 99% процессорного события

Я уже писал в список рассылки python и eventlet, поэтому я прошу прощения, если я выгляжу нетерпеливым.

Я запускаю eventlet 0.9.16 на небольшом (не микро) зарезервированном экземпляре Ubuntu 11.10 aws.

У меня есть сокет-сервер, который похож на эхо-сервер из примеров в документации Eventlet. Когда я впервые запускаю код, все кажется нормальным, но я заметил, что через 10 или 15 часов загрузка процессора возрастает с 1% до 99+%. В этот момент я не могу установить дополнительные соединения с сокет-сервером.

Это код, который я запускаю:

    def socket_listener(self, port, socket_type): 
        L.LOGG(self._CONN, 0, H.func(), 'Action:Starting|SocketType:%s' % socket_type)   
        listener = eventlet.listen((self._host, port)) 
        listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        pool = eventlet.GreenPool(20000)
        while True: 
            connection, address = listener.accept() 
            connection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            L.LOGG(self._CONN, 0, H.func(), 'IPAddress:%s|GreenthreadsFree:%s|GreenthreadsRunning:%s' % (str(address[0]), str(pool.free()),str(pool.running())))
            pool.spawn_n(self.spawn_socketobject, connection, address, socket_type)
        listener.shutdown(socket.SHUT_RDWR)
        listener.close()

Метод L.LOGG просто записывает предоставленные параметры в таблицу mysql.

Я запускаю socket_listener в потоке примерно так:

def listen_phones(self):  
    self.socket_listener(self._port_phone, 'phone') 

t_phones = Thread(target = self.listen_phones)
t_phones.start() 

Исходя из моих начальных поисков в Google, я подумал, что проблема может быть похожа на ошибку, о которой сообщалось на https://lists.secondlife.com/pipermail/eventletdev/2008-October/000140.html но я использую новую версию eventlet так, что не может быть это?

2 ответа

Если listener.accept() не является блокирующим, вы должны перевести поток в спящий режим на некоторое время, чтобы планировщик ОС мог передать работу другим процессам. Сделайте это, поставив

time.sleep(0.03)

в конце вашего while True петля.

Извините за поздний ответ.

Там не было никакого кода, как listener.setblocking(0)следовательно, он ДОЛЖЕН вести себя как блокировка и не должен требовать сна.

Кроме того, пожалуйста, используйте инструмент, как ps или же top по крайней мере, чтобы убедиться, что это процесс Python, который съедает весь процессор.

Если проблема не устранена, сообщите об этом на один из следующих каналов:

Другие вопросы по тегам