我正在研究一个学习Python,SQL,Javascript,运行服务器的项目 - 基本上掌握了全栈。现在我的基本目标是:
我想无限地运行Python脚本,它不断地对不同的服务进行API调用,这些服务具有不同的速率限制(例如200 /小时,1000 /小时等)并将结果(int)存储在数据库中(PostgreSQL的)。我希望在一段时间内存储这些结果,然后开始处理这些数据,以便在前面显示有趣的内容。我需要这个全天候运行。我试图在这里了解一般的架构,并且周围的搜索已经证明非常困难。粗糙伪代码的基本思想是:
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.
然后我会进入我的服务器,运行python myScript.py &
,关闭我的笔记本电脑,等待数据滚动。这是我的问题:
cron
之类的调度程序,但速率限制是可变的。当我的极限被击中时,我不能每小时运行一次脚本,比如5分钟进入开始时间并且等待时间为60分钟。即使每隔一段时间运行它也会显得凌乱:我需要睡眠持续的速率限制等待时间,这将持续变化。假设调度程序不是去这里的方法,我是否正确? 我有兴趣在这里学习不同的方法和最佳实践 - 非常感谢任何和所有建议!
答案 0 :(得分:1)
我实际上完全按照您的个人应用程序执行操作,我可以解释如何执行此操作。
我使用Celery而不是cron,因为它允许更好地调整调度,它是Python而不是bash,所以它更容易使用。我有不同的任务(基本上是一组API调用和数据库更新)到不同的时间间隔运行的不同站点,以考虑各种不同的速率限制。
我将Celery应用程序作为服务运行,因此即使系统重新启动,重启应用程序也是微不足道的。
我广泛使用我的应用程序中的日志库,因为当你拥有的是一个难以阅读的堆栈跟踪时,很难调试某些东西。我在整个应用程序中传播了INFO级别和DEBUG级别的日志,并且任何WARNING级别和以上日志都会打印到控制台并发送到我的电子邮件。
对于异常处理,我准备的大部分内容都是速率限制问题和随机连接问题。确保在try-except语句中包含您发送到API端点的任何HTTP请求,并且可能只实现重试机制。
就数据库连接而言,连接的时间长短并不重要,但是您需要确保在try-except语句中包围主应用程序循环,并通过关闭连接确保它正常失败例外的情况。否则,您可能最终会遇到大量的ghost连接,并且在这些连接消失之前,您的应用程序无法重新连接。