【问题标题】:Best method of continuously collecting data from an API?从 API 持续收集数据的最佳方法?
【发布时间】:2017-10-13 01:38:55
【问题描述】:

所以我有一个 python 脚本,它不断地从 API 收集数据,然后定期(例如每分钟)将它们保存到一个 excel 文件中。为此,我有一个 24/7 运行代码的 VPS。由于我需要来自多个来源的数据并且它们需要以不同的频率更新,我的解决方案是为每种类型的数据创建一个单独的函数,然后在单独的线程中调用它们。

举个例子:

def ExchangeRateCheck(self):
    while True:
        try:
            self.exchangeRate = self.oanda.get_prices(instruments="AUD_USD").get('prices')[0]['ask']
        except:
            try:
                self.exchangeRate = requests.get('http://free.currencyconverterapi.com/api/v3/convert?q=AUD_USD').json()['results']['AUD_USD']['val']
            except:
                pass

        time.sleep(30)

ratethread = threading.Thread(target=self.ExchangeRateCheck, args=())
ratethread.daemon = True
ratethread.start()

考虑到无法访问 API 的时间,所有内容都嵌套在 try/except 子句中。然而,我发现一些线程仍然会在某个时候因为某种未知原因退出。

我的问题是: 对于这种类型的任务是使用远程 VPS 并在一段时间内使用单独的函数 True 循环最好的解决方案?有没有更好的方法来 24/7 收集数据?我能否更好地处理异常以确保代码永不停止运行?

您可能会说我不是专业开发人员,因此非常感谢任何反馈,请随意对我努力,我不会被冒犯的。

【问题讨论】:

  • 欢迎您。守护线程只是告诉解释器,如果主线程退出,就可以结束进程,而不是等待所有其他线程停止。

标签: python api vps python-multithreading data-science


【解决方案1】:

考虑通过外部化调度部分来进一步简化它。您可以使用 cron 以不同的时间间隔和不同的参数(即数据源 URL)运行脚本。这样您就可以避免自己编程并发问题。

【讨论】:

    【解决方案2】:

    这是“最好”的方式吗?那要看。老实说,您可以在一个线程中完成所有这些操作,尽管时间会因发出 http 请求所需的时间而略有不同。

    不过,我确实有几点需要注意:

    • 您正在使用 try / except,这很好,但您并没有明确接受任何特定错误,这有点糟糕。您应该指定要接受哪些错误(例如无法访问服务器、无效的 json 内容等)。 请记住,您还可以排除任何未知错误,并对它们执行其他操作,如下所示:

      尝试: do_something_here() 除了 MadeUpError 为 e: print("处理了编造的错误。") 例外为 e: Print("发生了一些意外:{}".format(e))

    • 您正在使用守护线程。守护线程允许程序在不先停止它们的情况下退出。这意味着如果您的主线程退出,整个程序也应该退出。我认为这不是您想要的,并且由于您的程序运行超过一秒钟然后退出,我假设您正在主线程中执行某些操作。您的数据检索工作人员是守护进程是否有特定原因?

    • 您没有简单的方法来停止该程序。您可以使用 threading.Event,而不是使用 while True:。这是主线程可以设置的标志,例如,它希望所有工作人员退出。主线程可以运行 try / except for KeyboardInterrupt,并且在 except 处理程序中您可以 .set() 该事件,告诉工作人员在完成当前正在执行的操作后退出。
    • 如果您发现自己需要更复杂的调度(可能需要每 30 秒执行一次,每 5 分钟执行一次,每天凌晨 12:30 执行一次),您可以考虑使用诸如 APScheduler 之类的库,它专门设计用于在特定时间以间隔运行函数,并支持不同的调度程序(尽管您可能需要使用线程的 backgroundScheduler)。
    • 您没有使用我可以看到的任何类型的日志记录或打印到屏幕上。对于要运行很长时间并且可能会遇到您以后想知道的错误的东西,通常最好记录一下。 Python 有一个很好的标准库附带的日志记录模块,它也有一个关于如何使用它的教程。您可以将日志消息发送到终端、文件、电子邮件等。有不同的日志记录级别,因此您可以将程序设置为,例如,仅向终端打印警告及以上,而调试和信息消息不会打印出来。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的详细回复! APScheduler 似乎非常有用,所以我会研究一下。我使用守护线程的主要原因是因为我不想阻止它们运行,除非我停止它们(我在主线程中有 KeyboardInterrupt)。主要功能并没有真正做任何事情,它基本上是 True: sleep(120),它只是为了确保脚本永远不会停止运行。不过,这种方法对我来说似乎很不合常理,我相信有更好的解决方案可以让一切永远运行。
    猜你喜欢
    • 2016-11-21
    • 2020-01-06
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    相关资源
    最近更新 更多