Python金字塔周期性任务

时间:2015-02-18 13:17:29

标签: python scheduled-tasks pyramid

我的问题是如何在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()?执行后会启动一个新的计时器实例吗?

3 个答案:

答案 0 :(得分:3)

虽然芹菜是一种相当重的"对于像这样的任务的解决方案,我建议使用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())

答案 1 :(得分:2)

对于python解决方案,请查看Celery Beat

对于更简单的内容,您只需使用计划0 0 * * *创建cron job即可。这将导致您的脚本每天午夜运行。

答案 2 :(得分:1)

您可以创建一个包含Pyramid功能的脚本作为框架的一部分(http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/commandline.html#writing-a-script);这将允许您拥有一个独立的功能,仍然可以访问您的金字塔螺母和螺栓。但根据您的更新,它仍然是一个独立的脚本,需要通过某种任务调度程序进行调度。

除非我遗漏了某些东西,否则金字塔不会一直运行"到了你可以有一个计时器或排序...你已经有一台服务器提供由金字塔处理的请求。我猜你可以做一些类似金字塔响应的东西,你可以点击一个计时器或其他东西,然后只是无限地运行,但这似乎是一种糟糕的事情。即使是上面的脚本想法 - 您可以执行一次并启动计时器并使其无限运行,但随后您的流程不断运行。

一个更好的解决方案是按照已建议写出当前日期的计划任务。生日到表,然后在您的视图中查询该表以供显示。