Вызывать один и тот же API более 2000 раз каждую минуту (JSON / PYTHON), использовать (синхронизация HTTP, асинхронизация HTTP, веб-сокет или другое)? - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь собрать 1-минутные данные по 2000+ акциям из API финансового учреждения каждую минуту, как только эти данные станут доступны.Я хочу собирать данные в течение торговых часов.Я хочу собрать эти данные, используя python.

Пример URL-адреса API [Недействительный URL-адрес]: https://api.finance.com/v1/marketdata/[STOCK]/1minute

Условия:

  1. Мы знаем, что все2000+ акций 1-минутные данные доступны для поиска, как только попадет минута. Например, если текущее время 10:02:00 AM, и я хотел бы получить данные 10:01:00 AM от GOOG, я бы назвал URL: https://api.finance.com/v1/marketdata/GOOG/1minute, и я бы увидел 10:Данные в 01:00.
  2. Мы знаем, что данные хранятся в формате JSON.
  3. Существует ограничение регулирования.Предположим, что ожидание составляет 500 миллисекунд между запросами.
  4. Мне нужны данные о тиках данных за одну минуту (т. Е. Open, Low, High, Close).

Вопрос: Как собрать все2000+ хранит данные в течение 30 секунд?

Решения, которые я придумала, хотя я не знаю, является ли она наиболее оптимальной в этой ситуации или мое понимание HTTP-запроса, HTTP-асинхронного, WebSocketкаким-то образом отсутствует.

Возможные решения ?:

  1. HTTP-запрос с циклом For: В настоящее время я использую простой цикл for и функцию time.sleep ().Это проще всего реализовать.Но проблема с ним в лучшем случае это занимает 16 минут из-за ограничения регулирования.
  2. Асинхронный HTTP: насколько я понимаю, я мог бы создать отдельный поток для каждой акции и таким образом собрать данные за одну минуту.Но, судя по тому, что я прочитал, максимум у меня может быть около 100 одновременно работающих потоков.Это правильное предположение?Кроме того, неужели большинство серверов не допускают одновременного выполнения большого количества запросов с одного клиентского компьютера?
  3. Websocket: насколько я понимаю, я мог бы просто создать одно соединение с сервером и получить данные, не беспокоясь оэтот предел дроссельной заслонки.В идеале я бы собрал приложение с помощью websocket.Это правильное предположение, что это лучший метод для такого рода проблем?Однако проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что их данные за 1 тиковую минуту доступны только через этот метод вызова API URL.Насколько я знаю, я не могу получить эти данные через соединение с веб-сокетом (т.е. если я подключусь к их URL-адресу веб-сокета: wss: //stream-finance.com/ws, данные за 1 минуту не являются одними из доступных данных вдругой конец) Вопрос, который у меня возник здесь: возможно ли создать соединение через веб-сокет с помощью https url?Кроме того, возможно ли получить эти 1-минутные данные через их URL-адрес websocket wss: //stream-finance.com/ws, если эти 1-минутные данные не являются одним из доступных вариантов получения?
  4. Другое: ихдругой метод, который будет работать лучше для этого экземпляра?

Лучшее решение ?: Лучшее решение, которое я вижу, это просто создать одно соединение с их сервером, а затем вызывать каждую акцию для обновления каждую 1 минуту черезв режиме реального времени».Но я не знаю, как реализовать это через предоставленный HTTPS URL.

enter image description here

1 Ответ

0 голосов
/ 29 декабря 2018

Ваш вопрос немного сбивает с толку.Здесь давайте разберемся с некоторыми проблемами.

Сервер

Выбор протокола связи полностью зависит от того, что реализует сторона сервера, вы просто соответствующим образом разрабатываете своего клиента.

Ниже представлен набор опций и техник, которые я видел:

  • HTTP Pooling (что я люблю называть техникой запуска и запуска) Просто выполните HTTP-запрос кзаинтересованная конечная точка на интервальной основе;Кажется, каждая минута - ваш случай использования.Это будет поддерживаться практически всеми HTTP API.
  • Длинный пул HTTP Подобный пул, сервер, поддерживающий длинный пул, будет зависать на HTTP-соединении, пока не получит соответствующие данные илитайм-аут достигнут.С точки зрения клиента, вы по-прежнему постоянно запрашиваете данные с интервалом, это просто сервер, который откладывает ответ до получения данных.
  • Веб-сокеты (Это идеально подходит для вашего случая) Это, по сути, объединение двух методов (упрощенное здесь), сервер будет отвечать, удерживая соединение, и непрерывно отправлять по нему новые данные.

Клиент

Независимо отпротокол, который вы решите использовать, ваше клиентское программное обеспечение должно будет так или иначе обрабатывать сетевые задержки.

Для простоты я предполагаю, что у вас есть функция, названная get_data(), которая выбирает данные изсервер, используя один из методов, описанных выше.

  • Синхронный Ваш клиент позвонит get_data(), обработает ответ и повторите.Вы привыкли к этому, вот как обычно работает python.

  • Асинхронный Ваш клиент будет отправлять вызовы get_data() одному работнику, а некоторые другие функции будутвыполняется при поступлении данных. По сути, позволяет вашей программе выполнять несколько вызовов API и обрабатывать их в порядке ответа, а не в порядке запроса.

  • Потоки Аналогдля синхронного поведения вы будете обрабатывать каждый запрос / ответ отдельным потоком ЦП, обрабатывая данные по мере их поступления. (со всеми предостережениями GIL Python *)

Примечание

Как ни странно, нити 2000+ не являются хорошим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...