个人博客,欢迎查看: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 分执行一次
}
}
-
timedelta
是datetime
中的一个对象,需要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
网友评论