2013-03-27 6 views
1

Я использую кучу sockets в моем скрипте Python, возможно, 20/s. Эфемерные, сделанные за три секунды. Я пытался сделать хорошую работу по отправке socket.close() ко всему, но почему-то CLOSE_WAIT статусы на sockets все еще продолжают накапливаться.Как принудительно закрыть CLOSE_WAIT-сокет в Python?

Как я могу принудительно закрыть эти CLOSE_WAITsockets? Или я могу установить на них нижний timeout? Они в конечном итоге накапливаются до места крушения.

Это мой сокет код:

 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) 
     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     s.settimeout(2) # 2 seconds timeout 

     l_onoff = 1 
     l_linger = 0 
     s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger)) 

     self.s = s   
     streamloop.add_callback(self.connect, s) 

Это мой близкий:

def full_close(self): 
    try: 
     self.stream.close() 
     self.s.close() 
    except Exception: 
     print 'full_close err: ', sys.exc_info()[1:3] 
     pass  
+0

Есть ли способ перебрать все сокеты 'open' или' close_wait', а затем убить их? Как ручной сбор мусора? – knutole

+0

Этот код не выполняет ничего, кроме подтверждения настройки по умолчанию. Не делайте этого, это просто приглашение кому-то позже поиграть с ним. – EJP

ответ

1

Похоже, вы протечки розетки где-то.

См. https://stackoverflow.com/a/11240739/412080 для получения дополнительной информации.

+0

Спасибо! Да, окончательно. Я просачиваю около 100-200 на 10 000 подключений. Но я читал, что Q, и я не могу, чтобы жизнь меня находила там, где они могут протекать. Я закрываю все (дважды!). Я также использую «Tornado IOStream» - и иногда получаю некоторые предупреждения здесь, но недостаточно, чтобы учесть все просочившиеся сокеты. Есть ли способ собрать их все время от времени и просто убить их? Еще раз спасибо. – knutole

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