Я пытаюсь решить эту проблему уже около недели. Либо я упускаю что-то действительно очевидное, либо проблема на стороне сервера 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 секунды)
Вы хотите мне сказать что-нибудь еще?
Я знаю, что мой код еще не сохраняет данные. Я просто пытаюсь получить это первым. Код плохой, но поскольку я тестирую короткий фрагмент, я не стал комментировать (я менял его много раз, пытаясь найти способ)
Заранее спасибо. Я очень надеюсь, что смогу преодолеть это.
Я пытаюсь решить эту проблему уже около недели. Либо я упускаю что-то действительно очевидное, либо проблема на стороне сервера API, либо сервер намеренно останавливает меня (я написал на Python). Что я пытаюсь сделать: [list] [*]Я пытаюсь получить финансовые данные (большая глубина рынка для всех рынков). Проблема в том, что API службы обмена поддерживает получение данных только для одного рынка (всего около 75-85, переменная). Поэтому я решил, что собираюсь запустить поток для каждого рынка. [*]Каждый поток будет обрабатывать один рынок, попытаться получить данные для этого рынка, в случае успеха вернуть, если нет, добавить рынок обратно в очередь, чтобы его позже обрабатывал новый поток. [*]Делайте это, пока не будут охвачены все рынки, и повторяйте бесконечно, чтобы сохранить данные. актуально [/list] Я написал это на Python, используя библиотеку запросов. Несколько итераций работает нормально, но потом сервер перестает отвечать. Чтобы преодолеть эту проблему, я добавил тайм-аут в Requests.get. Тайм-аут истекает, но сервер также не отвечает на новые запросы около 1 минуты. Затем в течение нескольких итераций все снова работает гладко, затем все останавливается, и это повторяется. Вот код Python. [code]import requests, json import thread, threading from time import sleep, clock
#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) [/code] Вот как программа ведет себя во время выполнения. [img]https://i.sstatic.net/fkTBQ.png[/img]
Завершено означает, что я получил все финансовые данные один раз и начинаю их обновлять снова. Как видите, вроде бы всё работает нормально, а потом начинает тормозить, таймаут. Внезапно все снова начинает работать нормально. Я также заметил, что после того, как я закрываю соединение get с помощью data.close(), TCP-соединение с состоянием TIME_WAIT остается в программе мониторинга TCP в течение длительного времени. После нескольких итераций их ТОННЫ просто ждут в состоянии TIME_WAIT. Итак, вот мой вопрос [list] [*]Возможно ли, что из всех TCP-соединений, которые остаются в состоянии TIME_WAIT, ждут, пока сервер отправит им какой-то сигнал для их освобождения? Если да, то возможно ли, что сервер перестанет отвечать мне из-за того, что у меня слишком много (живых? активных?) соединений одновременно? [*]Если нет, то почему происходит период задержки, когда время ожидания всех моих запросов на получение истекает? Это потому, что сервер может иметь ограничение на количество запросов на одного клиента в минуту? и когда я достигаю этого, примерно через минуту, он волшебным образом снова начинает работать нормально. [*]У меня есть ТОННЫ и ТОННЫ TCP-соединений, ожидающих в состоянии TIME_WAIT, и они продолжают накапливаться. (Я запускаю около 80 подключений в секунду. Если для полного освобождения соединений требуется 4 минуты, то накопится 19200 подключений.) Как решить эту проблему, это вообще проблема? [*]Я запускаю так много потоков. Это проблема? [*]Получать все данные линейным образом, один рынок за другим, не вариант, слишком медленно, данные будут устаревшими. Есть ли другие способы, которыми я могу поддерживать актуальность всех данных о рынках? (максимум 3 секунды) [*]Вы хотите мне сказать что-нибудь еще? [/list] Я знаю, что мой код еще не сохраняет данные. Я просто пытаюсь получить это первым. Код плохой, но поскольку я тестирую короткий фрагмент, я не стал комментировать (я менял его много раз, пытаясь найти способ) Заранее спасибо. Я очень надеюсь, что смогу преодолеть это.