2016-03-17 17 views
0

我有一个部署在单个AWS EC2实例上的Flask应用程序。在我的__init__.py文件中,我已经实例化了一个BackgroundScheduler,并且计划每隔1小时运行一次作业。 这里是我的__init__.py代码的例子:APScheduler在单个EC2实例上多次调用

application = Flask(__name__) 
app = application 
scheduler = BackgroundScheduler() 
run_my_jobs = scheduler.add_job(my_job, 'interval', hours=1) 
scheduler.start() 

我会假设,因为实例化的瓶背景之外完成的,与运行在EC2上只有一个单一实例,我的调度应该只被实例化一次,无论有多少用户全天连接到我的Flask应用程序。

过去几个月的情况通常就是这样,但是最近在过去的几天里,我注意到调度器每小时一直在执行这个工作几乎2-3次。虽然我一直在继续推送代码到生产环境中,但__init__.py文件保持不变,所以我很困惑有什么可能的原因导致调度程序的多个实例化?

+0

你是如何运行你的应用程序? – davidism

+0

@davidism我把它放在应用程序模块中,当它被推送到AWS时,有一个application.py文件导入应用程序并调用application.run() – nicknaky

+0

这不会解决您的问题,但不要使用内置在生产中的开发服务器。它不是为此设计的。 – davidism

回答

0

通常有两种方式会发生这种情况:

  1. 使用一个以上的工作进程
  2. 把那就是你的应用程序的入口点模块中的代码,而不是与if __name__ == '__main__':块保护它

从你的描述我假设#1不是这样,所以我会去#2。

+0

因此,代码位于我的应用程序模块的\ __ init__.py文件中。然后,在应用程序模块/目录之外的单独文件中,是一个application.py文件,其中包含if \ __ name__ ==“\ __ main__”:block,其中包含application.run(),并且应用程序对象先前从应用中导入。考虑到在EC2上部署的需求将通过根目录下的application.py文件,而我的应用程序模块位于应用程序文件夹内,那么设置这种方法的正确方法是什么? – nicknaky

+0

我对EC2没有经验,但通常进口不应该有副作用。将调度程序设置代码放入一个函数中,并从application.py中导入并调用该函数。 –