2015-09-10 3 views
2

Я испытывал слишком медленное выполнение запросов Python на некоторых машинах и конкретном пользователе, в то время как другие инструменты (например, завитки) довольно быстры. Странно то, что если запустить сценарий в качестве другого пользователя, тогда он работает так, как ожидалось. Если я запустил сценарий на своей машине (как в Windows, так и в Linux), то он будет работать так же, как ожидалось. Проблемными машинами являются серверы Windows 2008 на Hyper-V. Обычно я использую запрос POST, но затрагиваются как POST, так и GET. Для демонстрации я создал простой скрипт с запросом GET. Все запросы занимают около 4,8 с, но это должно занимать около 0,03 (виртуальные машины не так сильны).Модуль запросов на Python очень медленный на конкретной машине

[imports and logging configuration omitted] 

log.info("Started ...") 

start = time.time() 
response1 = requests.get("http://10.50.30.216:8080/sps/api/version") 
assert response1.status_code == codes.OK 
log.info("Using requests: %.3fs" % (time.time() - start)) 

start = time.time() 
conn = httplib.HTTPConnection("10.50.30.216:8080") 
conn.request("GET", "/sps/api/version") 
response2 = conn.getresponse() 
assert response2.status == codes.OK 
log.info("Using httplib: %.3fs" % (time.time() - start)) 

log.info("Finished ...") 

Вывод при регистрации в качестве проблемного пользователя (к сожалению, я должен использовать этого пользователя). Посмотрите, что модуль запросов ожидает 4.523s перед открытием соединения, пока модуль httplib работает немедленно.

2015-09-11 14:50:00,832 - INFO - myscript - Started ... 
2015-09-11 14:50:05,355 - INFO - requests.packages.urllib3.connectionpool - Starting new HTTP connection (1): 10.50.30.216 
2015-09-11 14:50:05,364 - DEBUG - requests.packages.urllib3.connectionpool - "GET /sps/api/version HTTP/1.1" 200 None 
2015-09-11 14:50:05,365 - INFO - myscript - Using requests: 4.533s 
2015-09-11 14:50:05,374 - INFO - myscript - Using httplib: 0.008s 
2015-09-11 14:50:05,375 - INFO - myscript - Finished ... 

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

2015-09-11 14:57:45,789 - INFO - myscript - Started ... 
2015-09-11 14:57:45,799 - INFO - requests.packages.urllib3.connectionpool - Starting new HTTP connection (1): 10.50.30.216 
2015-09-11 14:57:45,806 - DEBUG - requests.packages.urllib3.connectionpool - "GET /sps/api/version HTTP/1.1" 200 None 
2015-09-11 14:57:45,809 - INFO - myscript - Using requests: 0.021s 
2015-09-11 14:57:45,815 - INFO - myscript - Using httplib: 0.004s 
2015-09-11 14:57:45,815 - INFO - myscript - Finished ... 

Я прочитал Python requests are slow #1 и Python requests are slower thann curl, но это не относится к моей проблеме.

+1

Попробуйте профилировать его: 'python -m cProfile your_script.py'. См. [Этот ответ] (http://stackoverflow.com/a/582337/1084416). –

+1

Это может быть связано с [pyOpenSSLl issue # 137] (https://github.com/pyca/pyopenssl/issues/137). Чтобы подтвердить или исключить это, не могли бы вы проверить, является ли «python -c» импорт OpenSSL «' уже медленным или просто фактическим запросом? (Также см. ['Request' # 2372] (https://github.com/kennethreitz/requests/issues/2372)) –

+0

Спасибо за ответ, но я не думаю, что это моя проблема, потому что 1) запросы хорошо работают при запуске как другой пользователь или на моем ноутбуке. 2) Каждый HTTP-запрос занимает почти 5 секунд, даже если в одном методе есть несколько последовательных запросов. Только первый запрос будет медленнее, если проблема будет вызвана проблемой импорта, не так ли? – Sobik

ответ

4

Может быть много вещей, замедляющих запрос. Все, что от DNS поиска, дросселирования и т.д.

Попробуйте получить больше информации, поворачивая Спросы ведение журнала отладки на

logging.basicConfig() 
logging.getLogger().setLevel(logging.DEBUG) 
requests_log = logging.getLogger("requests.packages.urllib3") 
requests_log.setLevel(logging.DEBUG) 
requests_log.propagate = True 
+0

Спасибо за подсказку. Я изменил свой пример (добавленный журнал и другой запрос http) в моем вопросе. Я добавил вывод от разных пользователей на той же машине, чтобы увидеть разницу. – Sobik

1

У меня была аналогичная проблема ... После того, как много отладки с авторами, мы пришли к выводу, что причина заключается в коде обнаружения прокси ...

Итак, когда я осуществил это, решить мою аналогичную проблему: requests: how to disable/bypass proxy

Авторы знают о проблеме, и они должны исправить в работах, и он должен быть освобожден скоро: https://github.com/kennethreitz/requests/pull/2992 ...

Надеется, что это помогает ...

Приветствию Jaka

+1

еще не выпущен? –

+0

Этот трюк работал для меня! – xobes

0

Если бы подобную проблеме. После исследования выяснилось, что внутренний вызов python на socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): вызывал задержку.

В моей конфигурации я был на Mac OS/X 10.11. host был dev.local, и у меня была соответствующая запись в /etc/hosts, указывающая на установку виртуальной машины в сети только для хоста.

192.168.56.101 dev.local 

После ударив головой в течение часа или двух, понял, что имена хостов, оканчивающиеся .local был фактическим вопрос (несмотря на /etc/hosts запись).

В конечном итоге это приведет меня к https://superuser.com/questions/539849/long-lookup-times-for-local-in-hosts-file. И все, что мне нужно, - это воела, избегая имен хозяев с .local.

Я понимаю, что это не проблема здесь - 10.50.30.216, очевидно, не заканчивается .local!Но поскольку этот вопрос был одним из самых актуальных, я наткнулся на поиск ответа на свою проблему, я думал, что отправлю ответ здесь.