多任务队列demo
pip3 install celery==4.4.2
pip3 install eventlet==0.25.2
pip3 install Django==2.0.4
-
配置settings文件
这里broker配置redis,同时backend也就是任务结果也存到redis中,格式为json,方便读写。
# 定义上传文件夹的路径 UPLOAD_ROOT = os.path.join(BASE_DIR, 'static/upload') CELERY_BROKER_URL = 'redis://localhost:6379/' CELERY_RESULT_BACKEND = 'redis://localhost:6379/' CELERY_RESULT_SERIALIZER = 'json'
-
创建与settings同级目录的celery.py
mydjango为当前项目名称
from __future__ import absolute_import, unicode_literals import os from celery import Celery # 设置环境变量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjango.settings') # 注册Celery的APP app = Celery('mydjango') # 绑定配置文件 app.config_from_object('django.conf:settings', namespace='CELERY') # 自动发现各个app下的tasks.py文件 app.autodiscover_tasks()
-
修改settings.py 同级目录下的init.py文件
from __future__ import absolute_import, unicode_literals from .celery import app as celery_app #导包 import pymysql #初始化 pymysql.install_as_MySQLdb() __all__ = ['celery_app']
-
在应用中创建tasks.py文件
from celery.task import task # 自定义要执行的task任务 @task def print_test(): print("nict try") return 'hello'
-
通过django视图调用异步请求
from myapp import tasks def ctest(request,*args,**kwargs): res=tasks.print_test.delay() #任务逻辑 return JsonResponse({'status':'successful','task_id':res.task_id})
-
启动celery服务 在manage.py同级目录下运行
celery worker -A mydjango -l info -P eventlet
如果请求是post方式 需要用此命令来启动服务
celery worker -A mydjango -l info --pool=solo
-
定时任务
settings.py文件中
from datetime import timedelta CELERY_BEAT_SCHEDULE = { # 定义定时任务 'celery_work': { 'task': "myapp.tasks.async_test", 'schedule': timedelta(hours=2) } }
如果需要启动定时任务,就需要在manage.py所在的文件夹内单独启动beat服务
celery -A mydjango beat -l info