Python Requests.get продолжает терять время ожидания около минуты, затем продолжает работать нормальноPython

Программы на Python
Ответить
Anonymous
 Python Requests.get продолжает терять время ожидания около минуты, затем продолжает работать нормально

Сообщение Anonymous »

Я пытаюсь решить эту проблему уже около недели. Либо я упускаю что-то действительно очевидное, либо проблема на стороне сервера API, либо сервер намеренно останавливает меня (я написал на Python).
Что я пытаюсь сделать:
  • Я пытаюсь получить финансовые данные (большая глубина рынка для всех рынков). Проблема в том, что API службы обмена поддерживает получение данных только для одного рынка (всего около 75-85, переменная). Поэтому я решил, что собираюсь запустить поток для каждого рынка.
  • Каждый поток будет обрабатывать один рынок, попытаться получить данные для этого рынка, в случае успеха вернуть, если нет, добавить рынок обратно в очередь, чтобы его позже обрабатывал новый поток.
  • Делайте это, пока не будут охвачены все рынки, и повторяйте бесконечно, чтобы сохранить данные. актуально
Я написал это на Python, используя библиотеку запросов. Несколько итераций работает нормально, но потом сервер перестает отвечать. Чтобы преодолеть эту проблему, я добавил тайм-аут в Requests.get. Тайм-аут истекает, но сервер также не отвечает на новые запросы около 1 минуты. Затем в течение нескольких итераций все снова работает гладко, затем все останавливается, и это повторяется.
Вот код Python.

Код: Выделить всё

import requests, json
import thread, threading
from time import sleep, clock

#Get queue
conn = requests.get('http://data.bter.com/api/1/pairs/')
mainQueue = json.loads(conn.content)
conn.close()

#Variable globals
marketCount = 0
queue = mainQueue[:]

#Static globals
lock = threading.Lock()
completeSize = len(queue)

def getOrderData(marketid):
global queue, marketCount

try:
data = requests.get(str('http://data.bter.com/api/1/depth/'
+marketid), timeout = 3)
except:
with lock:
print "Timed out: %s" % marketid
queue.append(marketid)
return

with lock:
marketCount += 1
data.close()
return

while True:
print "##################################"

#Initialize data
crT = clock()
marketCount = 0
queue = mainQueue[:]

#Start retrieving all markets
while marketCount != completeSize:
while len(queue) == 0 and marketCount != completeSize:
sleep(0.01)

if marketCount != completeSize:
marketid = queue.pop(0)
thread.start_new_thread(getOrderData, (marketid,))

#Print time spent
print "Finished, total time:",clock()-crT
sleep(1)
Вот как программа ведет себя во время выполнения.
Изображение

Завершено означает, что я получил все финансовые данные один раз и начинаю их обновлять снова. Как видите, вроде бы всё работает нормально, а потом начинает тормозить, таймаут. Внезапно все снова начинает работать нормально. Я также заметил, что после того, как я закрываю соединение get с помощью data.close(), TCP-соединение с состоянием TIME_WAIT остается в программе мониторинга TCP в течение длительного времени. После нескольких итераций их ТОННЫ просто ждут в состоянии TIME_WAIT.
Итак, вот мой вопрос
  • Возможно ли, что из всех TCP-соединений, которые остаются в состоянии TIME_WAIT, ждут, пока сервер отправит им какой-то сигнал для их освобождения? Если да, то возможно ли, что сервер перестанет отвечать мне из-за того, что у меня слишком много (живых? активных?) соединений одновременно?
  • Если нет, то почему происходит период задержки, когда время ожидания всех моих запросов на получение истекает? Это потому, что сервер может иметь ограничение на количество запросов на одного клиента в минуту? и когда я достигаю этого, примерно через минуту, он волшебным образом снова начинает работать нормально.
  • У меня есть ТОННЫ и ТОННЫ TCP-соединений, ожидающих в состоянии TIME_WAIT, и они продолжают накапливаться. (Я запускаю около 80 подключений в секунду. Если для полного освобождения соединений требуется 4 минуты, то накопится 19200 подключений.) Как решить эту проблему, это вообще проблема?
  • Я запускаю так много потоков. Это проблема?
  • Получать все данные линейным образом, один рынок за другим, не вариант, слишком медленно, данные будут устаревшими. Есть ли другие способы, которыми я могу поддерживать актуальность всех данных о рынках? (максимум 3 секунды)
  • Вы хотите мне сказать что-нибудь еще?
Я знаю, что мой код еще не сохраняет данные. Я просто пытаюсь получить это первым. Код плохой, но поскольку я тестирую короткий фрагмент, я не стал комментировать (я менял его много раз, пытаясь найти способ)
Заранее спасибо. Я очень надеюсь, что смогу преодолеть это.

Подробнее здесь: https://stackoverflow.com/questions/219 ... ontinues-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»