在django中使用celery执行异步任务和定时任务

0、python 版本 3.7.3

1、安装django, 安装celery, 安装rabbitmq并运行。

1.1、解决因版本冲突导致的worker启动异常(python 3.7)

https://www.jianshu.com/p/5173a79d2d6c


2、pip install django-celery, 版本参考下面

amqp==1.4.9

anyjson==0.3.3

billiard==3.3.0.23

celery==3.1.15

Django==2.2.4

django-celery==3.3.1

dnspython==1.16.0

eventlet==0.25.0

greenlet==0.4.15

importlib-metadata==0.19

kombu==3.0.37

librabbitmq==2.0.0

monotonic==1.5

pytz==2019.2

six==1.12.0

sqlparse==0.3.0

vine==1.3.0

zipp==0.5.2


3、把djcelery加到项目settings.INSTALLED_APPS中,数据迁移python manage.py migrate

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'djcelery',

    'demo',

]


4、celery配置(settings)

djcelery.setup_loader()

CELERY_ENABLE_UTC = True

CELERY_TIMEZONE = 'Asia/Shanghai'

BROKER_URL = 'amqp://guest@localhost//'

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'

CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' # 任务元数据保存到数据库中

CELERY_ACCEPT_CONTENT = ['application/json']

CELERY_TASK_SERIALIZER = 'json'

CELERY_RESULT_SERIALIZER = 'json'

CELERY_TASK_RESULT_EXPIRES = 3600  # celery任务执行结果的超时时间,

CELERYD_CONCURRENCY = 1 if DEBUG else 10 # celery worker的并发数

CELERYD_MAX_TASKS_PER_CHILD = 100  # 每个worker执行了多少任务就会销毁


5、在项目目录下(与settings同级)创建celery.py文件

from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') # 项目的settings文件

app = Celery('proj') # 项目名为入参

app.config_from_object('django.conf:settings') # 读取settings中的celery配置

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


6、在app的目录下创建tasks.py

from __future__ import absolute_import

import time

from celery import shared_task

from random import randint

@shared_task

def dosomething():

"""

定义异步任务,返回任务结果

"""

    print('task start...')

    time.sleep(30)

    print('task end...')

    return randint(0,10) #


7、定义视图,调用异步任务

from django.http import JsonResponse

from celery.result import AsyncResult

# Create your views here.

from .tasks import dosomething # 引入定义好的异步任务

def test(request):

    """

    异步调用任务

    :param request:

    :return:

    """

    result = dosomething.delay() # 调用任务,task_name.delay()  返回值为任务的task_id,可通过此id查任务的进度和结果

    return JsonResponse({'msg': 'ok', 'task_id': result.task_id}) # 返回task_id给调用者

def check_result(request, task_id):

    """

    通过任务id查询任务结果

    :param request:

    :param task_id:

    :return:

    """

    res = AsyncResult(task_id)

    if res.ready(): # 检查指定任务是否已经完成

        return JsonResponse({'msg': res.result}) # res.result为任务函数的返回值,即任务结果

    return JsonResponse({'msg': 'not finish yet...'})


8、路由配置

urlpatterns = [

    path('test/', test),

    re_path('^check/(?P.*)/$', check_result),

]


9、启动worker:

进入项目根路径,启动命令:celery -A proj worker -l info

如果celery是4.x版本,在win上运行可能会有问题,此时需要拓展pip install eventlet

命令:celery -A proj worker -l info -P eventlet

启动成功会显示下图

在django中使用celery执行异步任务和定时任务_第1张图片


10、启动django应用,通过请求来触发异步任务和查看结果

正常触发任务,并返回task_id

在django中使用celery执行异步任务和定时任务_第2张图片

任务接受和完成的打印

查询结果

到此,已基本完成了django和celery结合。


11、如果需要监控任务,可以安装flower,可以监控各个任务的执行情况和worker的状态

pip install flower

另起终端,启动监控

python manage.py celery flower

默认会启动一个监听进程,端口是5555

http://localhost:5555

在django中使用celery执行异步任务和定时任务_第3张图片

DEMO链接 django-with-celery.rar

链接:https://pan.baidu.com/s/18et02YyXm9fEX5TPVvyKeg

提取码:lchh


12、定时任务配置

    a、先在django后台配置好定时任务

在django中使用celery执行异步任务和定时任务_第4张图片
在django中使用celery执行异步任务和定时任务_第5张图片

b、启动定时任务监听

    celery -A proj beat -l info

监听启动成功后,到达时间就会发送任务

在django中使用celery执行异步任务和定时任务_第6张图片

你可能感兴趣的:(在django中使用celery执行异步任务和定时任务)