参考 https://zhuanlan.zhihu.com/p/162039762
参考 https://blog.csdn.net/libing_thinking/article/details/78547816
-
安装依赖环境
pip install redis==3.4.1 pip install celery==4.4.2 pip install eventlet # celery 4.0+版本以后不支持在windows运行,还需额外安装eventlet库
-
配置setting文件
# celery相关配置 # 配置celery时区,默认时UTC。 timezone = TIME_ZONE # 任务队列的链接地址 celery配置redis作为broker。redis有16个数据库,编号0~15,这里使用第1个。 # 先安装redis # apt install redis # 然后设置密码为 redis # redis-cli -h 127.0.0.1 # config set requirepass jlcssadmin broker_url = 'redis://:password@127.0.0.1:6379/1' # 设置存储结果的后台 结果队列的链接地址 result_backend = 'redis://:password@127.0.0.1:6379/0' # 可接受的内容格式 accept_content = ["json"] # 任务序列化数据格式 task_serializer = "json" # 结果序列化数据格式 result_serializer = "json" # 可选参数:给某个任务限流 # task_annotations = {'tasks.my_task': {'rate_limit': '10/s'}} # 可选参数:给任务设置超时时间。超时立即中止worker # task_time_limit = 10 * 60 # 可选参数:给任务设置软超时时间,超时抛出Exception # task_soft_time_limit = 10 * 60 # 可选参数:如果使用django_celery_beat进行定时任务 # beat_scheduler = "django_celery_beat.schedulers:DatabaseScheduler" # 更多选项见 # https://docs.celeryproject.org/en/stable/userguide/configuration.html
-
在settings.py同级目录下新建celery.py,添加如下内容
from __future__ import absolute_import, unicode_literals import os from celery import Celery from celery.schedules import crontab from datetime import timedelta from django.conf import settings # 指定Django默认配置文件模块 os.environ.setdefault('DJANGO_SETTINGS_MODULE', '项目名 .settings') # 为我们的项目myproject创建一个Celery实例。这里不指定broker backend 容易出现错误。 # 如果没有密码 使用 'redis://127.0.0.1:6379/0' app = Celery('项目名 ', broker='redis://:password@127.0.0.1:6379/0', backend='redis://:password@127.0.0.1:6379/0') # 这里指定从django的settings.py里读取celery配置 app.config_from_object('django.conf:settings') # 下面的设置就是关于调度器beat的设置, # 具体参考https://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html app.conf.beat_schedule = { 'autosc': { # 取个名字 'task': 'user.tasks.auto_sc', # 设置是要将哪个任务进行定时 'schedule': crontab(), # 调用crontab进行具体时间的定义 }, } # 自动从所有已注册的django app中加载任务 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
-
在settings.py同级目录下的__init__中添加如下内容:
from __future__ import absolute_import, unicode_literals # 引入celery实例对象 from .celery import app as celery_app __all__ = ('celery_app',)
-
启动redis,测试celery是否配置成功
# Linux下测试 # 启动的项目名,而不是应用名 celery -A myproject worker -l info # Windows下测试 celery -A myproject worker -l info -P eventlet
不报错就是运行成功
-------------- celery@ubuntu v5.0.5 (singularity) --- ***** ----- -- ******* ---- Linux-5.8.0-41-generic-x86_64-with-glibc2.29 2021-02-06 09:53:35 - *** --- * --- - ** ---------- [config] - ** ---------- .> app: AseetRadar:0x7f1a299a8670 - ** ---------- .> transport: redis://:**@127.0.0.1:6379/0 - ** ---------- .> results: redis://:**@127.0.0.1:6379/0 - *** --- * --- .> concurrency: 2 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ----- -------------- [queues] .> celery exchange=celery(direct) key=celery
-
上面2.2中我们已经配置了定时任务,接下来我们要编写定时任务函数,和异步执行函数,在你的app目录下面创建一个tasks.py文件(注意:只能要tasks),内容如下
from __future__ import absolute_import from celery import shared_task @shared_task # 定义的定时任务函数 def auto_sc(): print('sc test?') return 'halo' # # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名 # 定义的两个异步函数 @shared_task(name="send_sms") def send_sms(): print("发送短信!!!") return "s" @shared_task(name="send_sms2") def send_sms2(): print("发送短信任务2!!!") print("p") return "p"
-
app/views.py 内容
from django.http import JsonResponse from . import tasks def deme_view(request): # 用delay方法运行函数,这里两个函数可以同时被调用,也就是并行 result_one = tasks.send_sms.delay() result_two = tasks.send_sms2.delay() # 用get方法拿到返回的结果 print(result_one.get()) print(result_two.get()) final_result = result_one.get() + result_two.get() return JsonResponse( { 'code': 200, 'message': 'success', 'data': { 'result': final_result } } )
-
启动服务
# 启动Django 服务 python manage.py runserver # Linux下测试 elery -A 项目名 worker -l info # win 下启动 celery -A 项目名 worker -l info -P eventlet # 如果有定时任务 还需要启动 celery -A 项目名 beat -l info