Python Web开发学习

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

2018-12-02  本文已影响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 分执行一次
    }
}

增加定时任务的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
上一篇下一篇

猜你喜欢

热点阅读