侧边栏壁纸
博主头像
爱运维 博主等级

行动起来,活在当下

  • 累计撰写 197 篇文章
  • 累计创建 143 个标签
  • 累计收到 21 条评论

目 录CONTENT

文章目录

django中使用celery异步执行耗时长的任务

Administrator
2018-05-16 / 1 评论 / 0 点赞 / 3 阅读 / 0 字
  • 每次修改完TASK需要重启worker:python manage.py celery worker --loglevel=info

  • 示例一的解决:将耗时的程序放到celery中执行

  • 示例二的解决:使用celery定时执行

名词

  • 任务task:就是一个Python函数

  • 队列queue:将需要执行的任务加入到队列中

  • 工人worker:在一个新进程中,负责执行队列中的任务

  • 代理人broker:负责调度,在布置环境中使用redis,也可以使用rabbitmq等


使用

  • 安装包(celery-with-redis对celery有版本需求,当执行安装celery-with-redis的时候如果版本不符合,会自动卸载celery并自动重装)


pip install celery
pip install celery-with-redis
pip install django-celery


  • 配置settings

INSTALLED_APPS = (
  ...
  'djcelery',
}

...

import djcelery
djcelery.setup_loader()
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERY_IMPORTS = ('应用名称.task')


  • 在应用目录下创建task.py文件       

import django     #测试不加如这两行启动worker要报错,而且需要加在最前
django.setup()

import time
from celery import task

@task
def sayhello():
    print('hello ...')
    time.sleep(20)
    print('world ...')



  • 迁移,生成celery需要的数据表

    python manage.py migrate

  • 启动Redis

    sudo redis-server /etc/redis/redis.conf

  • 启动worker

    python manage.py celery worker --loglevel=info


  • 调用语法

    function.delay(parameters)

  • 使用代码

from task import *

def sayhello(request):
    sayhello.delay()#如果有参数sayhello.delay(x,y,z)
    return HttpResponse("hello world")




0

评论区