需求:使用django框架实现定时任务功能,在网上找资料后,最后决定使用celery,功能确实强大。
1、相关依赖安装包
django-1.11.17
celery-3.1.25
django-celery-3.2.1
Erlang(otp_win64_21.2.exe)
rabbitmq-server-3.7.11.exe
注:安装的是windows环境
2、安装 django celery
不再赘述,使用python方式安装即可:
pip install django
或
python setup.py install
3、安装Erlang
双击 otp_win64_21.2.exe 安装,配置个环境变量吧:
ERLANG_HOME
4、安装rabbitmq
双击 rabbitmq-server-3.7.11.exe 安装即可,默认安装后的监听端口:5672
激活 RabbitMQ’s Management Plugin:
D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.11\sbin>
rabbitmq-plugins.bat enable rabbitmq_management
然后重启一下服务(以管理员方式启动cmd):
net stop RabbitMQ && net start RabbitMQ
默认安装后,会存在个管理员: guest / guest
这里就不探讨rabbitmq的详细使用,使用guest管理员进行连接。
使用浏览器打开: http://localhost:15672/ ,使用guest用户登录成功即可。
5、django + celery 配置
在django项目的 settings.py 中配置:
# settings.py
# 在这里加上 djcelery,这样django自带的后管就可以管理celery
INSTALLED_APPS = [
'djcelery'
]
# 加上这段代码
import djcelery
djcelery.setup_loader()
BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False
CELERYD_CONCURRENCY = 10
CELERYD_MAX_TASKS_PER_CHILD = 1
在django项目settings.py同目录下新建下 celery.py,这样就可以自动发现配置的定时任务:
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ocean.settings')
app = Celery('ocean')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
# 在django项目目录下执行,新建celery相关的数据库表
python manage.py makemigrations
python manage.py migrate
结果:
这样就可以在后台配置定时任务了:
6、简单使用
新建个测试的定时任务(相当于模板):
tasks.py
# 测试任务
@shared_task()
def excute_sql(x,y):
print "%d * %d = %d" % (x, y, x * y)
return x * y
在后台配置具体的参数:
启动celery:
# 启动 Celery Beat 进程,定时将任务发送到 Broker,在项目根目录下执行下面命令:
celery beat -A ocean
#启动 Celery Worker 进程,在项目的根目录下执行下面命令:
celery -A ocean worker --loglevel=info
会看到这些输出,结果就为 9*5 =45
参考:
https://www.cnblogs.com/huangxiaoxue/p/7266253.html
https://www.cnblogs.com/ericli-ericli/p/5902270.html
http://blog.51cto.com/shineforever/1737323