从API连续收集数据的最佳方法?

2024-10-02 00:21:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

举个例子:

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和单独的函数在一个while真循环中的最佳解决方案?有没有更好的方法可以全天候收集数据?我能更好地处理异常以确保代码永不停止运行吗?在

因为你可能会告诉我不是一个专业的开发人员,所以任何反馈都是高度赞赏的,请随意对我严厉一点,我不会被冒犯的。在


Tags: 数据函数代码selfapi类型getvps
2条回答

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

不过,我有几件事需要注意:

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

    尝试: 在这里做点什么() 除了MadeUpError as e: print(“处理了错误。”) 除e类例外: Print(“发生意外:{}”。format(e))

  • 您正在使用守护程序线程。守护进程线程允许程序在不首先停止它们的情况下退出。这意味着如果主线程退出,整个程序也应该退出。我不认为这是你想要的,因为你的程序运行超过一秒钟,然后退出,我假设你在主线程中做了些什么。您的数据检索工作者是守护程序有什么特殊的原因吗?

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

希望这有帮助。在

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

相关问题 更多 >

    热门问题