异步任务
1:环境准备
安装celery,rabbitmq-server,django-celery.
pip install celery
pip install-django-celery
apt-get install rabbitmq-server
2:启动消息中间件rabbitmq
因为官方推荐用它,也可以用redis,也可以用Django。但是redis会因为断电的原因造成数据全部丢失等问题。用Django显得比较业余。
让其在后台运行
sudo rabbitmq-server -detached
3:Django代码相关
目录结构如下
1): settings.py文件
import djcelery
djcelery.setup_loader()
INSTALLED_APPS = [
............
'celerytest',
'djcelery',
'kombu.transport.django',
]
2): urls.py文件
from celerytest import views
urlpatterns = [
url(r"^index", views.IndexView.as_view(), name="index"),
]
3): tasks.py文件
import time
from celery import Celery
app = Celery('task', broker='amqp://', backend="amqp://")
@app.task(name="task1") #name参数必须传
def celery_test(args):
print 2222222222
print args
filename = time.strftime("test.txt")
with open(filename, "w") as f:
f.write("Hello World!")
time.sleep(2)
print 333333333333333333
4): views.py文件
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.http import HttpResponse
from django.views.generic import View
from tasks import celery_test
class IndexView(View):
def get(self, request):
print 11111111111111
celery_test.delay("test") # delay中传入任务的参数
return HttpResponse("OK")
4."重要" ==> python manage.py makemigrations
python manage.py migrate "迁移"
5. 启动worker ==>进入到tasks.py文件所在目录, 执行 celery -A tasks worker --loglevel=info -c 20
6. 启动django ==> python manager.py runserver
-c表示可最多处理20个任务
定时任务
如果定时任务的话,在上面的基础上还需要再加上以下代码
如果install_apps中加入了djcelery后,还没有同步数据库的话,
还需要执行 python manage.py migrations 和 python manage.py migrate 来同步数据库;
settings.py文件中添加
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
from celery.schedulesimport crontab
from datetimeimport timedelta
CELERYBEAT_SCHEDULE = {
'timing': {
'task':'database.tasks.celery_test',
#'schedule': crontab(minute=u'15', hour=u'14',), # 每天的14:15分执行任务
'schedule': timedelta(seconds=10), # 每隔10秒钟调用一次
'args': ("test",) #这里是被调用函数传入的参数值
}
}
注意:启动celery时需要加上beat参数。
python manage.py celery worker -c 20 -loglevel=info --beat
或者
python manage.py celery worker -l info -c 20 --beat
-c表示可最多处理20个任务