Python динамически обновляет / добавляет / удаляет модули - PullRequest
0 голосов
/ 08 мая 2018

Я задавал похожие вопросы несколько дней назад, но это было немного неясно, поэтому я удалил его и сделал этот новый здесь.

У меня есть проект, который получает рыночные данные с бирж криптовалюты (Binance, Kraken, Poloniex и т. Д.). Я хочу иметь возможность добавлять дополнительные обмены, пока проект запущен и работает. Например, я получаю данные каждые 10 секунд из Binance и Poloniex, но теперь я хочу добавить поддержку Kraken. Как я могу продолжать получать данные с двух других бирж (добавить Кракена без перезапуска программы).

В настоящее время я имею в виду 2 решения.

  • Запустить клиент, извлекающий данные как новый процесс для каждого обмена
  • Используйте importlib.import_module() для загрузки новых модулей и обработки каждого обмена в одном и том же процессе (используя asyncio)

Кроме того, что если я хочу добавить такие функции, как получение данных из другой конечной точки API. Метод 1, вероятно, потребовал бы перезапуска, а с методом 2 я мог бы перезагрузить все модули и обновить экземпляры классов между вызовами выборки. Но я не уверен в побочных эффектах, которые это может вызвать.

Может быть, есть способ по умолчанию для реализации такого проекта?

1 Ответ

0 голосов
/ 08 мая 2018

Я хотел бы рассмотреть вопрос о разработке базового класса с именем что-то вроде CryptoCurrencyExchangeParser. Этот класс будет иметь методы, которые позволят клиентскому коду извлекать данные стандартным способом, независимо от того, из какого обмена он поступил. Каждый конкретный обмен будет тогда подклассом, содержащим методы (возможно, определенные в базовом классе как абстрактные) для доступа и анализа данных.

Тогда я бы написал фабричную функцию для загрузки одного парсера, возможно, указанного строкой. Эта фабричная функция будет использовать механизм импорта python, чтобы найти код для запрошенного парсера. Основная программа будет хранить список активных анализаторов.

Такой дизайн означал бы, что все парсеры использовали один и тот же механизм, независимо от того, были ли они загружены при запуске программы или спустя десять лет. Будь то многопроцессорная обработка, многопоточность или какой-либо другой подход, будет вынесено за отдельное проектное решение.

...