【问题标题】:Python dynamically update/add/remove modulesPython 动态更新/添加/删除模块
【发布时间】:2018-05-07 22:26:45
【问题描述】:

几天前我问了一个类似的问题,但有点不清楚,所以我删除了它并在这里重新制作了一个。

我有一个从加密货币交易所(Binance、Kraken、Poloniex 等)获取市场数据的项目。我希望能够在项目启动并运行时添加额外的交换。例如,我每 10 秒从 Binance 和 Poloniex 提取数据,但现在我想添加对 Kraken 的支持。如何继续从其他两个交易所获取数据(添加 Kraken 而不重新启动程序)。

我目前想到了 2 个解决方案。

  • 将获取数据的客户端作为每次交换的新进程启动
  • 使用importlib.import_module() 加载新模块并在同一进程中处理每个交换(使用异步)

另外,如果我想添加从另一个 API 端点获取数据等功能怎么办。方法 1 可能需要重新启动,使用方法 2 我可以重新加载所有模块并在 fetch 调用之间更新类实例。但我不确定这可能导致的副作用。

也许有一种默认方式是如何实现这样一个项目的?

【问题讨论】:

  • 每个交换一个进程似乎是合理的,但即使它们都在一个进程中,重启成本真的那么高吗?您可以在另一个程序仍然处于活动状态时启动该程序,并在它准备好接管时杀死另一个程序,如果它足够重要的话。

标签: python api fetch python-asyncio cryptocurrency


【解决方案1】:

我会考虑设计一个基类,命名为CryptoCurrencyExchangeParser。此类将具有允许客户端代码以标准方式提取数据的方法,无论数据来自哪个交换。每个特定的交换都将是一个子类,包含用于访问和解析数据的方法(可能在基类中定义为抽象)。

然后我会编写一个工厂函数来加载一个解析器,可能由一个字符串指定。这个工厂函数将使用 python 导入机制来查找请求的解析器​​的代码。主程序会保留一个活动解析器的列表。

这样的设计意味着所有解析器都使用完全相同的机制,无论它们是在程序启动时加载还是十年后加载。是否使用多处理、多线程或其他方法将作为单独的设计决策考虑在内。

【讨论】:

  • 正是我目前正在做的事情。我想我会保持这种方法并开始第二个过程,而另一个过程会像@tdelaney 建议的那样关闭
猜你喜欢
  • 2023-03-22
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 2011-07-20
相关资源
最近更新 更多