前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Celery实现定时任务crontab

Celery实现定时任务crontab

作者头像
Python碎片公众号
发布2021-02-26 14:14:17
1.9K0
发布2021-02-26 14:14:17
举报
文章被收录于专栏:Python碎片公众号的专栏

定时任务的应用场景非常广,基本上所有的开发人员都会接触到定时任务,实现定时任务有很多方法,其中Celery里面的定时任务功能就非常强大,并且使用非常简单,只需要安装celery就行,下面就详细介绍celery实现定时任务的步骤.

代码语言:javascript
复制
# 安装celery
pip install celery

一. 搭建celery定时任务架构 在项目中适合的位置新建一个定时任务目录celery_crontab,在目录下创建config.py, main.py, tasks.py三个文件,分别用于编写配置代码,定时任务实现代码,任务函数代码

代码语言:javascript
复制
# 目录结构
- celery_crontab
    - config.py
    - main.py
    - tasks.py

二. 编写代码实现定时任务

1.在config.py中编写配置代码

代码语言:javascript
复制
from celery import Celery


# broker,rabbitmq
app = Celery('celery_crontab', broker='amqp://guest@localhost//')
# app = Celery('demo', broker='redis://127.0.0.1:6379/15')

2.在tasks.py中编写任务函数代码

代码语言:javascript
复制
from config import app


@app.task
def crontab_func1():
    print('在此编写任务要实现的代码')
  
  
@app.task
def crontab_func2():
    print('在此调用实现了定时任务功能的函数或方法')
  

3.在main.py中调用任务,并实现定时任务功能

代码语言:javascript
复制
from celery.schedules import crontab
from tasks import *


# 设置定时任务
app.conf.beat_schedule = {
    # 设置定时任务的参数,key可以自定义,见名知义,
    # value为定时任务的相关参数的字典
    'contab_func1-every-1-minute': {
        # 指定要执行的任务函数
        'task': 'tasks.crontab_func1',
        # 设置定时启动的频率,没分钟执行一次任务函数
        'schedule': crontab(minute='*/1'),
        # 传入任务函数的参数,可以是一个列表或元组,
        # 如果函数没参数则为空列表或空元组
        'args': []
    },
    'contab_func2-every-day': {
        'task': 'tasks.crontab_func2',
        # 每周一至周五早上8点执行任务函数
        'schedule': crontab(minute=0, hour=8, 
                            day_of_week=[1, 2, 3, 4, 5]),
        'args': []
    },
}


# 实现定时任务的另一种方式
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # sender.add_periodic_task(间隔时间秒, 
    # 任务名.s(参数), name='自定义任务名')
    sender.add_periodic_task(10.0, crontab_func1.s(), 
                             name='crontab_func1 every 10')
    sender.add_periodic_task(
        # 每分钟执行一次
        crontab(minute='*/1'), 
        # .s()内传入任务函数需要的参数
        crontab_func2.s()
    )

在celery文档中例举了更多任务频率的设置方式,可以直接阅读文档 Celery documentation:

http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html

也可以按住Ctrl左键点击代码中的crontab,进入源码看__doc__(文档注释)内容,里面也例举了很多任务频率的设置方法

三. 启动定时任务 启动定时任务应在main.py的位置,所以最好到main.py所在目录下执行命令,在其他位置启动时要指定main的路径

代码语言:javascript
复制
'''
使用multi方式启动定时任务,celery会自动生成任务子节点和自动创建子进程
work为执行任务的进程名字
-A main 指定定时任务的启动函数main
-l info 指定日志等级为info
-B 将celery定时任务设置为后台守护进程,不占用终端
--logfile=celerylog.log 指定日志保存的文件名.也可指定路径加文件名
'''
celery multi start work -A main -l info -B --logfile=celerylog.log
# 停止定时任务时,将start换成stop
celery multi stop work -A main -l info -B --logfile=celerylog.log
# 重启定时任务,将start换成restart
celery multi restart work -A main -l info -B --logfile=celerylog.log

Celery的使用场景中,不管是实现异步任务,还是实现定时任务,基本都会依赖命令来启动和停止任务,所以Celery的命令是非常多的,了解更多celery的命令可以到文档里查看. Celery documentation:

http://docs.celeryproject.org/en/latest/reference/celery.bin.celery.html

也可以在终端输入 celery -h 查看帮助信息. Windows Bug:RuntimeError: This platform does not support detach. site-packages\celery\platforms.py中尝试导入模块 “resource”时失败,这个模块不支持Windows,所以定时任务应该部署在Linux系统上.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档