Django + Celery

2019-04-25  本文已影响0人  爱修仙的道友

一、安装及使用

目录结构

image.png

二、setting.py 引入配置

INSTALLED_APPS = [
    ...
    'djcelery',
]


# celery配置
from .celeryconfig import *

BROKER_BACKEND = 'redis'
BROKER_URL = 'redis://localhost:6379/1'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2'

三、celery相关配置

# celeryconfig.py

import djcelery
from datetime import timedelta


djcelery.setup_loader()


# 设置队列

CELERY_QUEUES = {
    # 定时任务队列
    'beat_queue':{
        'exchange':'beat_queue',
        'exchange_type':'direct',
        'binding_key':'beat_queue'
    },

    # 耗时任务队列
    'work_queue':{
        'exchange':'work_queue',
        'exchange_type':'direct',
        'binding_key':'work_queue'
    }
}

# 设置默认任务队列
CELERY_DEFAULT_QUEUE = 'work_queue'

CELERY_IMPORTS = (
    'course.tasks',
)

# 有些情况可以防止死锁
CELERYD_FORCE_EXECV = True

# 设置并发的worker数量
CELERYD_CONCURRENCY = 4

# 允许任务重试
CELERY_ACKS_LATE = True

# 每个worker最多执行100个任务后被销毁,可以防止内存泄漏
CELERYD_MAX_TASKS_PER_CHILD = 100

# 单个任务最大运行时间 超过则取消任务
CELERYD_TASK_TIME_LIMIT = 12 * 30

# 定时任务设置
CELERYBEAT_SCHEDULE = {
    'task1':{
        'task':'course-task',
        'schedule':timedelta(seconds=5),
        # 指定队列
        'options':{
            'queue':'beat_queue',
        }
    }
}

在相关app目录下编写 tasks.py 文件

from .tasks import CourseTask
from django.http import JsonResponse


def func(request):
    # 执行异步任务
    print('start do request')
    course_task = CourseTask()
    course_task.delay()
    # 在函数中指定队列
    course_task.apply_async(args=('hello',),queue='beat_queue')
    print('end do request')
    return JsonResponse({'result':'ok'})

views.py 引入

from .tasks import CourseTask
from django.http import JsonResponse


def func(request):
    # 执行异步任务
    print('start do request')
    CourseTask.delay()
    # 在函数中指定队列
    CourseTask.apply_async(args=('hello',),queue='beat_queue')
    print('end do request')
    return JsonResponse({'result':'ok'})

urls.py

from django.urls import path
from .views import func

urlpatterns = [
    path('func/', func, name='func' ),
]

开启worker 和beat

python manage.py celery worker -l INFO
python manage.py celery beat -l INFO

展示

现在发送请求就可以使用定时任务和异步任务了 0.0

上一篇下一篇

猜你喜欢

热点阅读