Какая часть python.socket может навсегда заморозить мой скрипт, даже если установлен тайм-аут?

библиотека oauth (ссылка из страница библиотеки Justin.tv Python) блокирует мои процессы Python на неопределенный срок в случайное время. Это происходит случайно, но ЧАСТО на одном из моих серверов. Я уверен, что это не связано с чем-то в моем коде, поэтому я вставляю часть дампа стека, связанную с библиотекой Python Justin.tv и oauth:

  File "/home/honstreams/honstreams/website/JtvClient.py", line 51, in get
    return self._send_request(request, token)
  File "/home/honstreams/honstreams/website/JtvClient.py", line 90, in _send_request
    return conn.getresponse()
  File "/usr/lib/python2.6/httplib.py", line 986, in getresponse
    response.begin()
  File "/usr/lib/python2.6/httplib.py", line 391, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python2.6/httplib.py", line 349, in _read_status
    line = self.fp.readline()
  File "/usr/lib/python2.6/socket.py", line 397, in readline
    data = recv(1)
KeyboardInterrupt

Суть в том, где он застрял перед KeyboardInterrupt. Я останусь на этой линии навсегда или, по крайней мере, на несколько дней, пока она будет работать.

Меня интересует, каким образом socket.py может заблокироваться, даже если установлен тайм-аут (иногда он действительно истекает), и как это можно предотвратить.


Вот еще немного информации

root@foo:~# python --version
Python 2.6.5
root@foo:~# uname -a
Linux foo.bar.no 2.6.32-31-generic-pae #61-Ubuntu SMP Fri Apr 8 20:00:13 UTC 2011 i686 GNU/Linux

person Hubro    schedule 14.10.2011    source источник


Ответы (1)


Эти строки из клиентской библиотеки Justin.tv Python актуальны:

def _send_request(self, request, token=None):
    request.sign_request(OAuthSignatureMethod_HMAC_SHA1(), self.consumer, token)
    conn = self._get_conn() # connection was requested here
    if request.http_method == 'POST':
        conn.request('POST', request.http_url, body=request.to_postdata())
    else:
        conn.request('GET', request.http_url, headers=request.to_header())
    return conn.getresponse()  # Error occurs here

def _get_conn(self):
    return httplib.HTTPConnection("%s:%d" % (self.host, self.port)) # no timeout!

Обратите внимание, что httplib.HTTPConnection не передается тайм-аут. Измените этот код, чтобы использовать тайм-аут, и обязательно определите, что происходит, когда происходит тайм-аут.

person Steven Rumbalski    schedule 14.10.2011