[英]How to perform periodic task with Flask in Python
我一直在使用Flask為我的k8055 USB接口板提供一個簡單的Web API; 相當標准的吸氣劑和推桿,Flask真的讓我的生活變得更輕松。
但我希望能夠在乳清發生時將狀態變化記錄為/接近。
例如,如果我有一個連接到電路板的按鈕,我可以輪詢該特定端口的api。 但如果我想讓輸出直接反映輸出,無論是否有人在與api交談,我都會有這樣的事情。
while True:
board.read()
board.digital_outputs = board.digital_inputs
board.read()
time.sleep(1)
每一秒,輸出都會更新以匹配輸入。
在Flask下有沒有辦法做這種事情? 我之前在Twisted中做過類似的事情,但Flask對於這個特定的應用程序來說太方便了,只是放棄它...
謝謝。
你可以使用cron來完成簡單的任務。
為您的任務創建一個燒瓶視圖。
# a separate view for periodic task
@app.route('/task')
def task():
board.read()
board.digital_outputs = board.digital_inputs
然后使用cron,定期從該URL下載
# cron task to run each minute
0-59 * * * * run_task.sh
run_task.sh內容的位置
wget http://localhost/task
Cron無法比一分鍾更頻繁地跑步。 如果您需要更高的頻率(例如,每5秒=每分鍾12次),您必須以下列方式在tun_task.sh中執行此操作
# loop 12 times with a delay
for i in 1 2 3 4 5 6 7 8 9 10 11 12
do
# download url in background for not to affect delay interval much
wget -b http://localhost/task
sleep 5s
done
對於我的Flask應用程序,我考慮使用Pashka在他的答案 , 日程安排庫和APScheduler中描述的cron方法。
我發現APScheduler很簡單並且服務於定期任務運行目的,所以繼續使用APScheduler。
示例代碼:
from flask import Flask
from apscheduler.schedulers.background import BackgroundScheduler
app = Flask(__name__)
def test_job():
print('I am working...')
scheduler = BackgroundScheduler()
job = scheduler.add_job(test_job, 'interval', minutes=1)
scheduler.start()
Pashka的回答很棒,但是
如果您的Linux是基於SystemD的,請使用其計時器(而不是傳統的cron) - https://wiki.archlinux.org/index.php/Systemd/Timers定期調用一些代碼。
沒有Flask中沒有任務支持,但你可以使用flask-celery或只是在單獨的線程(greenlet)中運行你的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.