2016-03-17 19 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中導入並調用該函數。 –