所以我有一个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真循环中的最佳解决方案?有没有更好的方法可以全天候收集数据?我能更好地处理异常以确保代码永不停止运行吗?在
因为你可能会告诉我不是一个专业的开发人员,所以任何反馈都是高度赞赏的,请随意对我严厉一点,我不会被冒犯的。在
这是“最好”的方法吗?那要看情况了。老实说,您可以在一个线程中完成所有这些任务,尽管时间会因发出http请求所需的时间而略有不同。在
不过,我有几件事需要注意:
您使用的是try/except,这很好,但是您没有明确接受任何特定的错误,这有点糟糕。您应该指定要接受哪些错误(例如无法访问服务器、无效的json内容等)。 请记住,您还可以排除任何未知错误,并对它们执行其他操作,例如:
尝试: 在这里做点什么() 除了MadeUpError as e: print(“处理了错误。”) 除e类例外: Print(“发生意外:{}”。format(e))
您正在使用守护程序线程。守护进程线程允许程序在不首先停止它们的情况下退出。这意味着如果主线程退出,整个程序也应该退出。我不认为这是你想要的,因为你的程序运行超过一秒钟,然后退出,我假设你在主线程中做了些什么。您的数据检索工作者是守护程序有什么特殊的原因吗?
希望这有帮助。在
考虑通过外部化调度部分来简化它。您可以使用cron以不同的时间间隔和不同的参数(即数据源URL)运行脚本。这样您就可以避免自己编程并发性的问题。在
相关问题 更多 >
编程相关推荐