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

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