Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从API连续收集数据的最佳方法?_Python_Api_Vps_Python Multithreading_Data Science - Fatal编程技术网

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

Python 从API连续收集数据的最佳方法?,python,api,vps,python-multithreading,data-science,Python,Api,Vps,Python Multithreading,Data Science,因此,我有一个python脚本,它不断地从API收集数据,然后定期(例如每分钟)将数据保存到excel文件中。为此,我有一个VPS,24/7运行代码。由于我需要来自多个数据源的数据,并且需要以不同的频率进行更新,因此我的解决方案是为每种类型的数据创建一个单独的函数,然后在单独的线程中调用所有这些函数 以下是其中一个示例: def ExchangeRateCheck(self): while True: try: self.exchangeRate

因此,我有一个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子句中。然而,我发现有些线程仍然会因为未知的原因在某个时刻退出

我的问题是: 对于这种类型的任务,在while-True循环中使用远程VPS和单独的函数是最好的解决方案吗?是否有更好的方式全天候收集数据?我能更好地处理异常以确保代码永远不会停止运行吗

正如你可能知道的那样,我不是一名专业的开发人员,因此任何反馈都是非常受欢迎的,请随意对我施加压力,我不会生气。

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

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

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

    尝试: 在这里做点什么 除MadeUpError as e外: 打印(“已处理虚构错误”) 例外情况除外,如e: 打印(“意外事件:{}”。格式(e))

  • 您正在使用守护进程线程。守护进程线程允许程序退出而不首先停止它们。这意味着如果主线程退出,整个程序也应该退出。我不认为这是您想要的,因为您的程序运行超过一秒钟然后退出,所以我假设您正在主线程中执行某些操作。您的数据检索工作人员是守护进程有什么具体原因吗

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

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

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

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

    尝试: 在这里做点什么 除MadeUpError as e外: 打印(“已处理虚构错误”) 例外情况除外,如e: 打印(“意外事件:{}”。格式(e))

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

  • 您没有简单的方法来停止程序。您可以使用threading.Event,而不是使用
    while True:
    。这是主线程在希望所有工作线程退出时可以设置的标志。主线程可以运行try/except for KeyboardInterrupt,并且在except处理程序中可以运行.set()该事件,告诉工人在完成当前正在做的事情后退出
  • <> LI>如果你发现自己需要更复杂的调度(也许一个工人需要每30秒执行一次,另一个需要每5分钟执行一次,另一个每天在12:30时执行),那么你可以考虑使用一个库,比如专门用来在一定时间内以间隔运行函数的库,并支持不同的调度器。(尽管您可能需要使用线程的backgroundScheduler)
  • 你没有在我能看到的屏幕上使用任何类型的日志记录或打印