2016-06-08 76 views
0

我正在研究一个学习Python,SQL,Javascript和运行服务器的项目 - 基本上掌握了整个堆栈。现在我的基本目标是这样的:连接到数据库时运行无限的Python脚本

我想无限地运行一个Python脚本,它不断地对不同的服务进行API调用,这些服务有不同的速率限制(例如200 /小时,1000 /小时等)和将结果(ints)存储在数据库(PostgreSQL)中。我想在一段时间内存储这些结果,然后开始使用这些数据在前端显示有趣的内容。我需要这个24/7运行。我试图了解这里的一般建筑,并且四处搜寻已经证明了令人惊讶的困难。我在粗糙的伪代码基本思路是这样的:

database.connect() 
def function1(serviceA): 
    while(True): 
    result = makeAPIcallA() 
    INSERT INTO tableA result; 
    if(hitRateLimitA): 
     sleep(limitTimeA) 
def function2(serviceB): 
    //same thing, different limits, etc. 

而且我ssh到我的服务器,运行python myScript.py &,关闭我的笔记本电脑了,并等待数据滚入这里是我的问题:

  • 这种方法是否有意义,还是应该做一些完全不同的事情?
  • 无限期地打开数据库连接被认为是“坏”还是危险?如果是这样,我还要如何管理数据库?
  • 我考虑使用调度程序,如cron,但速率限制是可变的。我无法每小时运行剧本,当我的极限被击中时,说明5分钟到开始时间并且等待60分钟之后。即使以微小的时间间隔运行它似乎也很麻烦:我需要休息以保持持续不变的限速等待时间。我是否正确地假设一个调度程序不是要去这里的路?
  • 我如何优雅地处理任何意外的潜在致命错误(即记录和重新启动)?手动杀死脚本或编辑脚本怎么办?

我很感兴趣学习不同的方法和最佳实践 - 任何和所有的建议将非常感谢!

回答

1

我实际上完全是你为我的个人应用程序做了什么,我可以解释我是如何做到的。

我使用芹菜而不是cron,因为它允许在调度中进行更好的调整,它是Python而不是bash,因此它更易于使用。我有不同的任务(基本上是一组API调用和数据库更新)到不同的站点,以不同的时间间隔运行,以解决各种不同的速率限制。

我将Celery应用程序作为服务运行,即使系统重新启动,重新启动应用程序也是微不足道的。

我在我的应用程序中广泛使用了日志记录库,因为当你只有一个难以读取堆栈跟踪的东西时,很难调试某些东西。我将INFO级别和DEBUG级别的日志传播到我的应用程序中,并且将任何警告级别和以上日志打印到控制台并发送到我的电子邮件。

对于异常处理,我准备的大部分是速率限制问题和随机连接问题。确保在try-except语句中包含发送给API端点的任何HTTP请求,并可能仅实现重试机制。

就数据库连接而言,连接的时间并不重要,但是您需要确保在try-except语句中包围主应用程序循环,并通过关闭连接来确保它正常失败在例外的情况下。否则,你可能会得到很多鬼连接,并且你的应用程序无法重新连接,直到这些连接消失。

相关问题