安装芹菜周期性任务
问题描述:
如何使用每小时查询数据库的Celerybeat和Flask设置定期任务?安装芹菜周期性任务
的环境是这样的:
/
|-app
|-__init__.py
|-jobs
|-task.py
|-celery-beat.sh
|-celery-worker.sh
|-manage.py
我现在有一个名为run_query()
查询功能位于task.py
我想要调度程序踢一旦应用程序启动,所以我有下面几行我/app/__init__.py
文件夹:
celery = Celery()
@celery.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(1, app.jobs.task.run_query())
(为简单起见,我已经设定,使如果它运行,它会每分钟运行一次。没有这样的运气呢。)
当我启动celery-worker.sh
它确认我的功能在[tasks]
标题下。但计划的函数从不运行。我可以手动迫使功能通过发出运行在命令提示以下:
>> from app.jobs import task
>> task.run_query.delay()
EDIT:添加celerybeat.sh
作为后续:如果数据库是通过烧瓶上下文中访问,在我的异步函数调用期间,创建一个新的上下文来访问数据库是明智的吗?使用现有的烧瓶环境?或者完全忘记上下文,只是启动到数据库的连接?我担心的是,如果我只是启动一个新的连接,它可能会干扰现有的上下文的连接?
答
要运行定期任务,你需要一些schduler(如芹菜拍)。
与命令芹菜拍是调度程序;它定期启动任务,然后由集群中可用的工作节点执行。
您必须确保一次只有一个调度程序正在运行时间表 ,否则最终会出现重复任务。使用集中式方法意味着日程安排不必是 同步,并且服务可以在不使用锁的情况下运行。
您可以调用调度,
$ celery -A proj beat #different process from your worker
您也可以通过嵌入使工人-B 选项击败工人里面,这是方便,如果您将永远不会运行多个工作人员节点,但它不常用,因此建议不要使用 以供生产使用启动调度uler:
$ celery -A proj worker -B
您还需要运行调度服务。 http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#starting-the-scheduler。 **芹菜击败**是一个调度程序;它定期开始执行任务,然后由集群中可用的工作节点执行。 –