由于superviser不支持python3,而网上关于celery后台运行的说明大都使用superviser,因此对于python3用户celery后台运行便成为了一个问题。再没废话,直接上代码。python
环境说明:redis
python3.6sql
django2.0.5数据库
咱们使用redis的做为celery任务队列,有一个合成包能够直接安装二者一块儿使用须要的安装包django
直接在终端键入json
pip install celery-with-redis
就能够安装须要的依赖包了 app
构建项目过程略过,直接开始进行celery配置异步
1、celery配置。
咱们的项目名称为myproject,首先setting配置,添加函数
# celery settings # celery中间人 redis://redis服务所在的ip地址:端口/数据库号 BROKER_URL = 'redis://localhost:6379/3' # celery结果返回,可用于跟踪结果 CELERY_RESULT_BACKEND = 'redis://localhost:6379/3' # celery内容等消息的格式设置 CELERY_ACCEPT_CONTENT = ['application/json', ] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' # celery时区设置,使用settings中TIME_ZONE一样的时区 CELERY_TIMEZONE = TIME_ZONE
而后在PATH/myproject/myproject/即setting的同级目录下建立celery.py,初始化celery。url
from __future__ import absolute_import, unicode_literals from celery import Celery from django.conf import settings import os # 获取当前文件夹名,即为该Django的项目名 project_name = os.path.split(os.path.abspath('.'))[-1] project_settings = '%s.settings' % project_name # 设置环境变量 os.environ.setdefault('DJANGO_SETTINGS_MODULE', project_settings) # 实例化Celery app = Celery(project_name) # 使用django的settings文件配置celery app.config_from_object('django.conf:settings') # Celery加载全部注册的应用 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) #Celery加载全部注册的应用 app.autodiscover_tasks(lambda:settings.INSTALLED_APPS)
这里第一行输入不能换位置,只能在首行,不然会报错。
这里的实例化celery的app咱们在别处要导入,为了方便导入,咱们把它放到__init__.py里,因此在/myproject/myproject/__init__.py咱们加入
from __future__ import absolute_import, unicode_literals # 引入celery实例对象 from .celery import app as celery_app
这样同时也能告知django celery.py文件的存在。
2、用celery装饰咱们的须要进行的异步函数。
咱们在项目根目录下建立celery_tasks模块,即在PATH/myproject/下建立该模块,而后在该模块下建立tasks.py,把咱们的耗时程序写进去。
from myproject import celery_app import time @celery_app.task def time_consuming_fun(): for i in range(5): time.sleep(1) print(i) return 'ok'
直接用咱们的celery_app下的task方法装饰须要进行异步处理的函数便可。
3、调用异步函数。
在view中调用,这里用的是Django的类视图。
from celery_tasks.tasks import time_consuming_fun from django.views import View from django.http import JsonResponse # Create your views here. class MyView(View): def get(self,request): #异步调用 time_consuming_fun.delay() #直接调用 #time_consuming_fun() return JsonResponse({'msg':'ok','code':200})
配置好url便可。
4、启动celery。
在项目根目录下,即managy同级文件目录下,输入命令:
celery -A myproject worker -l info
此时celery在终端窗口运行,关闭终端celery就会中止。
输入命令
celery multi start w1 -A myproject -l info --logfile = celerylog.log --pidfile = celerypid.pid
此时celery为守护进程,日志记录在celerylog.log里。
日志文件能够指定路径PATH/celerylog.log,此时会在指定路径下建立日志文件。进程号文件相似。
中止或重启将开始换为stop或restart便可,因此需记录w1,即需记录woker的名称来方便重启和中止。