[英]Python Pyramid periodic task
我的問題是如何在Pyramid Python框架中執行一個簡單的任務?
我有一個用戶生日的桌子,我想每天檢查某人是否有生日,如果有,請打印一個簡單的問候語。
所以我在views.py中定義了一些東西:
def print_greetings():
tomorrow = datetime.date.today()+datetime.timedelta(days=1)
users = sess.query(User).filter(func.DATE_FORMAT(User.bday, "%d_%m")==tomorrow.strftime("%d_%m")).all()
if len(users) > 0:
for u in users:
print("Happy Birthday", u.name)
所以問題是:我應該如何以及在哪里寫一些東西來執行此功能一天一次?
UPD:我需要從Pyramid應用程序運行任務,像cron這樣的外部工具不是我想要的東西。
也許某種計時器將執行print_greetings()? 執行后會啟動一個新的計時器實例嗎?
雖然Celery對於像這樣的任務來說是一個相當“重量級”的解決方案,但我建議使用APScheduler 。 您可以像在cron中一樣設置調度程序,但它將在您的應用程序中運行。 在這種情況下,內存中的作業存儲正常工作。
import atexit
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.start()
scheduler.add_job(print_greetings,
id='greetings',
name='Send out birthday greetings',
trigger='cron',
minute=0,
hour=12,
)
atexit.register(lambda: scheduler.shutdown())
有關python解決方案,請查看Celery Beat 。
對於更簡單的事情,您可以使用計划0 0 * * *
創建一個cron作業 。 這將導致您的腳本每天午夜運行。
您可以創建一個包含Pyramid功能的腳本作為框架的一部分( http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/commandline.html#writing-a-script ); 這將允許您擁有一個獨立的功能,仍然可以訪問您的金字塔螺母和螺栓。 但根據您的更新,它仍然是一個獨立的腳本,需要通過某種任務調度程序進行調度。
除非我遺漏了某些東西,否則Pyramid不會“一直運行”到你可以擁有計時器或排序......你已經有一台服務器提供由金字塔處理的請求。 我猜你可以做一些類似金字塔響應的東西,你可以點擊一個計時器或其他東西,然后只是無限地運行,但這似乎是一種糟糕的事情。 即使是上面的腳本想法 - 您可以執行一次並啟動計時器並使其無限運行,但隨后您將有一個持續運行的進程。
一個更好的解決方案是按照建議將當前幾天的生日寫入表中,然后在視圖中查詢該表以進行顯示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.