美文网首页Python Web开发学习
Celery异步任务,增加定时任务

Celery异步任务,增加定时任务

作者: 吾星喵 | 来源:发表于2018-12-02 19:22 被阅读1次

    个人博客,欢迎查看:https://blog.starmeow.cn/

    上篇请查看使用Celery+Redis实现异步任务,supervisor守护进程运行

    Celery定时任务

    只需要在settings文件中添加配置 CELERYBEAT_SCHEDULE 字段并在 CELERY_IMPORTS 中导入任务模块(可不要)就可以实现定时任务

    配置Django的settings增加定时

    from datetime import timedelta
    from celery.schedules import crontab
    
    CELERY_BEAT_SCHEDULE = {
        # 'add-every-xx-seconds': {
        #     'task': 'app_blog.blog.tasks.print_info',
        #     'schedule': timedelta(seconds=2),  # 每 30 秒一次
        #     # 'schedule': timedelta(minutes=1),         # 每 1 分钟一次
        #     # 'schedule': timedelta(hours=4),           # 每 4 小时一次
        #     'args': ('settings中的定时任务',)  # 任务函数参数,如果只有一个参数,一定要加逗号
        # },
        'send_qq_blog_request_count': {
            'task': 'app_blog.blog.tasks.count_blog_everyday_request',
            'schedule': crontab(hour=23, minute=30),  # 每天晚上 23 点 30 分执行一次
        }
    }
    
    • timedeltadatetime中的一个对象,需要from datetime import timedelta引入,有如下几个参数

      • days:天
      • seconds:秒
      • microseconds:微妙
      • milliseconds:毫秒
      • minutes:分
      • hours:小时
    • crontab的参数有:

      • month_of_year:月份
      • day_of_month:日期
      • day_of_week:周
      • hour:小时
      • minute:分钟

    增加定时任务的tasks函数

    该定时任务的功能是统计每天博客访问量,在每天晚上 23 点 30 分发送QQ消息

    from app_blog.log.models import BlogRequestLog
    
    
    @app.task
    def count_blog_everyday_request():
        today_request_count = BlogRequestLog.objects.filter(created_time__day=datetime.datetime.now().day).count()
        now_time_str = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        qqbot_api_data(qqbot_host_port, '/send_group_msg', group_id=531809487, message='博客访问统计!\n统计时间:{}\n今天我的博客共有{}次访问啦~~~'.format(now_time_str, today_request_count))
    

    启动Celery的works和beat

    启动 Celery Beat 进程,定时将任务发送到 Broker

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

    Windows下启动

    (StarMeow) D:\LR@ProjectsSync\OneDrive\PycharmProjects\StarMeow>celery -A StarMeow worker --pool=solo -l info
    (StarMeow) D:\LR@ProjectsSync\OneDrive\PycharmProjects\StarMeow>celery -A StarMeow beat -l info
    

    Linux启动

    (StarMeow) root@StarMeow-Svr:~/django-web/StarMeow#celery -A StarMeow worker -l info
    (StarMeow) root@StarMeow-Svr:~/django-web/StarMeow#celery -A StarMeow beat -l info
    

    因为works已经在supervisor中启动好了,只需要重新加载一下就行,然后启动beat,测试可以修改一下时间,看是否能正常执行定时任务

    image.png

    同时启动works和beat

    如果你同时使用了异步任务和计划任务,有一种更简单的启动方式celery -A StarMeow worker -B -l info,可同时启动worker和beat(-B一定要大写的)

    celery+supervisor启动works和beat

    只需要修改celery.ini配置文件里面的执行命令即可

    配置celery.ini

    root@StarMeow-Svr:~/django-web# cd Supervisor/
    (Supervisor) root@StarMeow-Svr:~/django-web/Supervisor# ls
    celery.ini  supervisord.conf
    (Supervisor) root@StarMeow-Svr:~/django-web/Supervisor# vim celery.ini
    

    celery.ini

    # 配置内容 
    [program:celery] 
    # celery命令的绝对路径 
    command=/root/.pyenv/versions/StarMeow/bin/celery -A StarMeow worker -B -l info 
    # 项目路径 
    directory=/root/django-web/StarMeow 
    # 日志文件路径 
    stdout_logfile=/var/log/myweb/celery.log 
    # 自动重启 
    autorestart=true 
    # 如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符 
    redirect_stderr=true 
    

    重载

    因为之前配置了自动重载脚本,只需要执行下即可

    (Supervisor) root@StarMeow-Svr:~/django-web/Supervisor# cd ..
    root@StarMeow-Svr:~/django-web# ./SvReload.sh 
    正在更新Supervisor配置···
    Restarted supervisord
    

    查看celery日志

    root@StarMeow-Svr:~/django-web# cat /var/log/myweb/celery.log
    

    相关文章

      网友评论

        本文标题:Celery异步任务,增加定时任务

        本文链接:https://www.haomeiwen.com/subject/vwhscqtx.html