簡體   English   中英

如何在Python中使用Flask執行定期任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM