Python金字塔周期性任务

5

我的问题是如何在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)

所以问题是: 如何在哪里编写内容,以便每天执行此函数? 更新:我需要从Pyramid应用程序运行任务,不是像cron这样的外部工具。 也许是一种计时器,它将执行print_greetings()?并且在执行后启动一个新的计时器实例?

1
使用“金字塔”方法,一旦你在开发机上使用pserve为应用程序提供服务,事情就会变得有点有趣。生产Web服务器通常会生成多个“工作”进程/线程,然后可以随时杀死或重新生成它们。工作进程实际上不应该做除了正常的请求/响应循环之外的任何事情。 - Sergey
3个回答

4

虽然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())

谢谢,看起来这正是我所寻找的东西。 - annndrey

2

如果需要使用Python解决方案,请查看Celery Beat

如果您需要更简单的解决方案,只需创建一个cron job,并设置计划为0 0 * * *。这将导致您的脚本每天午夜运行一次。


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

除非我漏掉了什么,否则Pyramid并没有“始终运行”到您可以拥有定时器或类似物的程度...您拥有一个服务器提供请求,这些请求由Pyramid处理。我想你可以做一些像点击一个Pyramid响应的东西,然后启动一个定时器或其他东西,然后无限运行,但这似乎是一种不好的方式。即使是上面的脚本想法-你可以执行它一次并启动一个定时器,让它无限运行,但是然后你就会有一个持续运行的进程。

一个更好的解决方案是按照建议编写一个定期任务,将当天的生日写入表中,然后在您的视图查询该表以显示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接