Я обслуживаю запросы от нескольких клиентов XMLRPC через WAN. Вещь отлично работает, скажем, в период одного дня (иногда два), а затем замерзает в socket.py:SimpleXmlRpcServer _sock.rcv зависает после тысяч запросов
data = self._sock.recv(self._rbufsize)
_sock.timeout -1, _sock.gettimeout не None
Там я ничего особенного не делаю в основном потоке (просто получая вызовы XMLRPC), есть еще два потока, говорящих с БД. Оба эти потока отлично работают и выживают в этом блоке (проверили с WinPdb). Клиенты отправляют запросы не дольше 1 КБ, и нет специального контента: просто красивые и чистые строки в словаре. Между двумя блокировками я обслуживаю десятки тысяч запросов без проблем. Брандмауэр выключен, нет странного программного обеспечения на той же машине и т. Д.
Я использую Windows XP и Python 2.6.4. Я проверил различия между 2.6.4. и 2.6.5, и не нашел ничего важного (или я ошибаюсь?). Версия 2.7 не является вариантом, поскольку я бы пропустил двоичные файлы для MySqlDB.
Единственное, что время от времени происходит от клиентов, имеющих плохое подключение к Интернету, - это разрыв разъемов. Это происходит каждые 5-10 минут (всего за пять секунд каждый клиент получает доступ к серверу каждые 2 секунды).
Я потратил много времени на эту проблему, теперь я начинаю терять любые идеи, что делать. Любой намек или мысль были бы высоко оценены.
Привет, Алекс, просто чтобы сообщить вам, что все прошло хорошо. Теперь, после 5 дней без каких-либо проблем, я осмелюсь сказать это. Уловка действительно находилась в фиксированном тайм-ауте, не оставляя SimpleXmlRPCServer на его тайм-ауте по умолчанию (None). Вы полностью решили мою проблему этим предложением. Однако два дня назад я поймал urlib2, страдающего от почти той же проблемы. Он застыл в гнездах.py (другой вызов socket.recv, всего в нескольких строках от предыдущего). –