依赖和环境说明
python3.6 django1.11.23 celery==3.1.25 异步任务 django-celery==3.2.2 定时任务管理包 redis==2.10.6 django-redis-cache==1.7.1 方便配置Redis缓存
以上依赖pip安装,不再赘述
配置
在django创建项目的项目配置路径下的__init__.py中添加
from __future__ import absolute_import, unicode_literals # This will make sure the app is always imported when # Django starts so that shared_task will use this app. from .celery import app as celery_app __all__ = ('celery_app',)
在django创建项目的项目配置路径下,创建celery.py,如下:
#! /usr/bin/python3 # -*- coding:utf-8 -*- # file: celery.py # author: wangchenxi # mail: wongchenxi@icloud.com # brief: # version: 0.1.00 # Create Time:2019-12-08 22:21:00 # Last Update: 2019-12-10 01:26:48 AM from __future__ import absolute_import, unicode_literals import os from celery import Celery, platforms from django.conf import settings from celery.schedules import crontab # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wangchenxi_top.settings') app = Celery('wangchenxi_top') # imports = ('api.tasks', 'blog.tasks') platforms.C_FORCE_ROOT = True # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. # - namespace='CELERY' means all celery-related configuration keys # should have a `CELERY_` prefix. app.config_from_object('django.conf:settings') # Load task modules from all registered Django app configs. app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))
在django创建项目的项目配置路径下settings.py中添加celery配置相关,如下:
import djcelery '''''' INSTALLED_APPS = [ # ... 'djcelery', # .... ] TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False djcelery.setup_loader() BROKER_URL = 'redis://127.0.0.1:6379' CELERY_CONCURRENCY = 10 CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379' CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
开发任务
在项目应用下创建tasks.py,并在项目应用views.py中引入(即使不调用也要引入,不然celery不能发现项目的task),才能在启动的时候自动发现注册任务函数。例如,本人开发的一个api应用添加tasks.py文件如下:
from celery import shared_task @shared_task def task_hello_world(*args): ''' xxxxxx ''' pass return 'hello,world'
需要在应用的views.py文件中引入如下views.py
from api.tasks import task_hello_world # 引入之后可以主动调用,发起异步任务,也可以通过配置的 # CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' 发起任务调用 # 如果任务没有在views.py文件中引入则视为任务没有注册,进而不能通过CELERYBEAT_SCHEDULER完成调用
在views.py主动调用的方法如下:
from api.tasks import task_hello_world def every_where(): ''' xxxxx ''' id = task_hello_world.delay(*args) # 如果需要返回结果需要记录id
启动准备及启动
安装完依赖,配置完之后,应该执行
python manage.py migrate # 因为django-celery模块会去创建djcelery.schedulers.DatabaseScheduler # 数据表 # 然后启动celery,同时启动beat python manage.py celery multi start worker --loglevel=info --beat # 如果不启动beat,则不能完成定时任务
其他
其他问题例如定时任务表怎么配置调用,需要说明的是:每一次调整或这添加定时任务都要重启加载celery。
具体怎么添加定时任务我觉得这个不再celery的配置和简单使用范畴。 在使用celery过程中发现beat调度部分cpu占用率太高,其实这个地方需要根据实际需求调整配置
#默认是0,就相当于是一个耗时循环 #CELERYBEAT_MAX_LOOP_INTERVAL= 0 CELERYBEAT_MAX_LOOP_INTERVAL= 1
总之,根据个人实际情况调整就是了。
版权声明:除特别注明外,本站所有文章均为王晨曦个人站点原创
转载请注明:出处来自王晨曦个人站点 » django-celery实现异步/定时任务