在虚拟环境中 pip install celery 即可安装celery
在django项目中使用celery做定时任务
settings.py
from celery import platforms
from celery.schedules import crontab
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0' # Broker配置,使用Redis作为消息中间件
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1' # BACKEND配置,这里使用redis
CELERYD_MAX_TASKS_PER_CHILD = 10 #每个worker执行多少次任务后死亡,防止内存泄漏用的
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml'] #接受的文件类型
CELERY_RESULT_SERIALIZER = 'json' # 结果序列化方案
# 允许root 用户运行celery
platforms.C_FORCE_ROOT = True
CELERY_BEAT_SCHEDULE = {
'logpolar': { # 任务名(随意起)
# 'task': 'Integration.tasks.lives', # 定时任务函数路径
'task':"Integration.tasks.logpolar",
'schedule': datetime.timedelta(seconds=10), # 任务循环时间
# 'schedule': crontab(hour=0, minute=1),
# "args": (4,9), # 参数
},
'RunTotalVisit': {
'task': 'Integration.tasks.RunTotalVisit',
'schedule': datetime.timedelta(seconds=10), # 任务循环时间
# 'schedule': crontab(hour=0, minute=10),
}
}
项目目录同名文件夹中init (也就是和setting在同一目录下)
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ('celery_app',)
celery.py(也就是和setting在同一目录下)
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'data_center.settings') # 设置django环境
app = Celery('data_center')#data_center是项目名
app.config_from_object('django.conf:settings', namespace='CELERY') # 使用CELERY_ 作为前缀,在settings中写配置
app.autodiscover_tasks() # 发现任务文件每个app下的task.py
tasks.py 在某个app中tasks.py(这个名字是固定的)
from celery import shared_task
@shared_task
def lives(a,b):
c = a + b
return "celery4.3" + c
然后启动项目
接着打开终端进入项目目录,执行下列命令
celery -A 项目名 worker -l info
celery -A 项目名 beat -l info
接着就可以在终端,看到打印的信息了
用supervisor启动celery,可以使celery后台运行
supervisor的安装与配置
虚拟环境中 pip install supervisor
安装好之后就可以
创建supervisord主进程配置文件
$ echo_supervisord_conf > /etc/supervisord.conf
在项目目录下新建celerylog文件夹,存放celery打印出的信息
把下面内容 追加到 supervisord.conf文件中,启动即可
[program:celery.worker]
command= /home/yue/.virtualenvs/practice/bin/celery -A 项目名 worker -l info
directory=/home/yue/测试celery4.3专用/项目名
user=root
numprocs=1
autostart=true ;#当supervisor启动时,程序将会自动启动
autorestart=true ;#自动重启
startretries=3 ;#启动失败时的最多重试次数
redirect_stderr=true ;#重定向stderr到stdout
stdout_logfile=/home/yue/测试celery4.3专用/项目名/celerylog/celery_worker_out.log
[program:celery.beat]
command=/home/yue/.virtualenvs/practice/bin/celery -A 项目名 beat -l info
directory=/home/yue/测试celery4.3专用/项目名
user=root
numprocs=1 ;#进程数
autostart=true ;#当supervisor启动时,程序将会自动启动
autorestart=true ;#自动启动
startretries=3 ;#启动失败时的最多重试次数
redirect_stderr=true ;#重定向stderr到stdout
stdout_logfile=/home/yue/测试celery4.3专用/data_center/celerylog/celery_beat_out.log
管理supervisor
启动:sudo supervisord -c /etc/supervisord.conf 在项目中
启动supervisor:supervisord -c supervisord.conf
supervisord -c /etc/supervisor/supervisord.conf
如果显示端口占用,执行下面命令
查看进程:ps -ef | grep supervisord
root 15334 6359 0 11:42 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c supervisord.conf
杀死supervisor进程:kill -s SIGTERM 15334
关闭supervisor:supervisorctl shutdown
重载配置:supervisorctl reload
1 )supervisorctl status
2)supervisorctl stop
3)supervisorctl start
4)supervisorctl restart
6)supervisorctl update
最后:supervisord 是 server 端,supervisorctl 是 client 端
crontab 定时 几点几分几秒
其中,crontab()实例化的时候没设置任何参数,都是使用默认值。crontab一共有7个参数,常用有5个参数分别为:
minute:分钟,范围0-59;
hour:小时,范围0-23;
day_of_week:星期几,范围0-6。以星期天为开始,即0为星期天。这个星期几还可以使用英文缩写表示,例如“sun”表示星期天;
day_of_month:每月第几号,范围1-31;
month_of_year:月份,范围1-12。
网友评论