iT邦幫忙

0

Python Flask 與 Flask-APScheduler 無法同時運行 (佈署在IIS上)

  • 分享至 

  • xImage

背景說明

如標題,
目前在測試Flask框架下,透過APScheduler定時執行任務,
Flask主程式跟APSceduler程式碼在同一個.py檔內,
並定時執行計數的工作,將計算值輸出到log.txt。

問題

將scheduler.start()寫在 if name == "main" 內,
就無法正常執行定時任務,但可以正確路由到網址,
如果把scheduler.start()移出來,
則定時任務正常執行,但就變成不能正確由到網址。

不知道是不是一次只能有一個thread在運行? 不知道有沒有相關文件可參考?
若是的話,該如何解決呢?

以下是程式碼的部分:

from flask import Flask
from apscheduler.schedulers.blocking import BlockingScheduler
import logging

app = Flask(__name__)

#設定Logging 參數
logging.basicConfig(level=logging.WARNING, filename='./log.txt',
	format='[%(asctime)s %(levelname)-8s] %(message)s',
	datefmt='%Y%m%d %H:%M:%S',
	)

#endregion

#時區設置
blockSched = BlockingScheduler(timezone="Asia/Taipei")

#region (測試用) APScheduler 用
initnum = 1
@blockSched.scheduled_job('interval', seconds=20)
def counter():
    global initnum
    total = initnum + 1 
    
    logging.error('計算: ' + str(total))
    print(total)

    initnum = total

#endregion


@app.route("/apstest")
def home():
    return "Hello Flask"

#blockSched.add_job(counter, 'interval', seconds=10)

#==== blockSched.start(),在這裡可以正常執行定時任務 ===========
#==== 但就變成無法正常路由到 /apstest ===========
#blockSched.start()

if __name__ == "__main__":
    #==== 可以正常路由到 /apstest ===========
    #==== 但就無法正常執行定時任務 ===========
    blockSched.start()
    app.run()

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
chunyenc
iT邦新手 5 級 ‧ 2022-06-03 10:36:22
最佳解答

使用 BackgroundScheduler,

我是使用 gunicorn + Flask-apscheduler 給你參考

edwang iT邦新手 4 級 ‧ 2022-06-08 14:33:29 檢舉

To chunyenc大:
目前嘗試使用BackgroundScheduler已可正常執行!
感謝C大。
未來會持續開發加入Gunicorn!

chunyenc iT邦新手 5 級 ‧ 2022-06-10 14:29:47 檢舉

https://viniciuschiele.github.io/flask-apscheduler/rst/tips.html

你可以參考這個,實際上他與 Flask 單獨引入 apscheduler 用法基本上一樣,因為我也在這個地方吃了蠻多苦頭的 .. QQ

我要發表回答

立即登入回答