繁体   English   中英

Python金字塔周期性任务

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM