Что я пытаюсь сделать:
- Я пытаюсь получить финансовые данные (большая глубина рынка для всех рынков). Проблема в том, что API службы обмена поддерживает получение данных только для одного рынка (всего около 75-85, переменная). Поэтому я решил, что собираюсь запустить поток для каждого рынка.
- Каждый поток будет обрабатывать один рынок, попытаться получить данные для этого рынка, в случае успеха вернуть, если нет, добавить рынок обратно в очередь, чтобы его позже обрабатывал новый поток.
- Делайте это, пока не будут охвачены все рынки, и повторяйте бесконечно, чтобы сохранить данные. актуально
Вот код 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