美文网首页
Django + Celery

Django + Celery

作者: 爱修仙的道友 | 来源:发表于2019-04-25 23:13 被阅读0次

    一、安装及使用

    • Install: pip install django-celery
    • Worker: python manage.py celery worker -Q queue

    目录结构

    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

    相关文章

      网友评论

          本文标题:Django + Celery

          本文链接:https://www.haomeiwen.com/subject/htuzgqtx.html