Получение ServerNotFoundError при использовании gevent/greenlets с запросами

Я пытаюсь распараллелить получение данных из удаленного API. У удаленного API нет возможностей для массовых операций, поэтому для каждого нужного мне объекта мне приходится делать отдельный запрос GET.

Я добавил gevent в смесь. Иногда это прекрасно работает, но если я снова попробую тот же набор запросов, 50 из 100 не будут работать с этим:

Traceback (most recent call last):
  ...
  File "/Users/---/venv/lib/python2.7/site-packages/httplib2/__init__.py", line 1570, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "/Users/---/venv/lib/python2.7/site-packages/httplib2/__init__.py", line 1317, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "/Users/---/venv/lib/python2.7/site-packages/httplib2/__init__.py", line 1258, in _conn_request
    raise ServerNotFoundError("Unable to find the server at %s" % conn.host)
ServerNotFoundError: Unable to find the server at my.remote.host

<Greenlet at 0x10c6eacd0: function_name(<Object1>, <Object2>, u'zebra', True)> failed with ServerNotFoundError

Любые мысли о способах решения этой проблемы? Является ли это результатом слишком большого количества запросов слишком быстро? Если да, то есть ли простой способ ограничить количество гринлетов?


person Z Jones    schedule 16.10.2013    source источник


Ответы (1)


Известно, что Gevent вызывает некоторые проблемы DNS с запросами python (которые вы непреднамеренно и неправильно пометили) как часть этого вопроса. К счастью для вас, мы уже сталкивались с этой проблемой, и пользователь решил ее. вот так

gevent.dns.resolve_ipv4('example.com')
# However you make your httplib2 call.

Имея это в виду, другой пользователь отметил, что этот может уже быть исправлен в новой версии получить.

Независимо от того, работает ли приведенный выше фрагмент для вас, вам, вероятно, следует попробовать обновить gevent, чтобы убедиться, что это не так.

person Ian Stapleton Cordasco    schedule 18.10.2013