django项目_Django项目使用Celery

4948a176ad24390f8275977dd7237d87.png

在网上看了好多Django的文章中坑很多,也比较老。试了各种姿势,什么djcelery等等,最后还是老老实实的用Celery,最为方便。本文只简单的介绍配置以及使用,需要理解概念的请自行查阅。

本文环境:Django 2.1.8 + Redis 3.1 + Celery 4.4

实现:1.定时任务 2.异步发送

  1. 安装环境 redis数据库自行安装
pip install redis==3.4.1
pip install celery==4.4.2
pip install eventlet # celery 4.0+版本以后不支持在windows运行,还需额外安装eventlet库

2. Celery配置

2.1 配置setting

# celery相关配置
# 配置celery时区,默认时UTC。
timezone = TIME_ZONE

# 任务队列的链接地址 celery配置redis作为broker。redis有16个数据库,编号0~15,这里使用第1个。
broker_url = 'redis://:password@127.0.0.1:6379/1'

# 设置存储结果的后台  结果队列的链接地址
result_backend = 'redis://:password@127.0.0.1:6379/0'

# 可接受的内容格式
accept_content = ["json"]
# 任务序列化数据格式
task_serializer = "json"
# 结果序列化数据格式
result_serializer = "json"

# 可选参数:给某个任务限流
# task_annotations = {'tasks.my_task': {'rate_limit': '10/s'}}

# 可选参数:给任务设置超时时间。超时立即中止worker
# task_time_limit = 10 * 60

# 可选参数:给任务设置软超时时间,超时抛出Exception
# task_soft_time_limit = 10 * 60

# 可选参数:如果使用django_celery_beat进行定时任务
# beat_scheduler = "django_celery_beat.schedulers:DatabaseScheduler"

# 更多选项见
# https://docs.celeryproject.org/en/stable/userguide/configuration.html

2.2 在settings.py同级目录下新建celery.py,添加如下内容:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.schedules import crontab
from datetime import timedelta
from django.conf import settings

# 指定Django默认配置文件模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'untitled.settings')

# 为我们的项目myproject创建一个Celery实例。这里不指定broker backend 容易出现错误。
# 如果没有密码 使用 'redis://127.0.0.1:6379/0'
app = Celery('untitled', broker='redis://:password@127.0.0.1:6379/0', backend='redis://:password@127.0.0.1:6379/0')

# 这里指定从django的settings.py里读取celery配置
app.config_from_object('django.conf:settings')
# 下面的设置就是关于调度器beat的设置,
# 具体参考https://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
app.conf.beat_schedule = {
    'autosc': {  # 取个名字
        'task': 'user.tasks.auto_sc',  # 设置是要将哪个任务进行定时
        'schedule': crontab(),  # 调用crontab进行具体时间的定义
    },
}
# 自动从所有已注册的django app中加载任务
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
 

2.3 在settings.py同级目录下的__init__中添加如下内容:

 from __future__ import absolute_import, unicode_literals
 
 # 引入celery实例对象
 from .celery import app as celery_app
 __all__ = ('celery_app',)

2.4 启动redis,测试celery是否配置成功

 # Linux下测试
 Celery -A myproject worker -l info
 
 # Windows下测试
 Celery -A myproject worker -l info -P eventlet

=======出现如下内容就是配置成功========

-------------- celery@DESKTOP-GM453OA v4.4.6 (cliffs)
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2020-07-21 12:55:23
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         untitled:0x1bb0fbaaa08
- ** ---------- .> transport:   redis://:**@127.0.0.1:6379/0
- ** ---------- .> results:     redis://:**@127.0.0.1:6379/0
- *** --- * --- .> concurrency: 8 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . send_sms
  . send_sms2
  . untitled.celery.debug_task
  . user.tasks.add
  . user.tasks.auto_sc

[2020-07-21 12:55:23,645: INFO/MainProcess] Connected to redis://:**@127.0.0.1:6379/0
[2020-07-21 12:55:23,651: INFO/MainProcess] mingle: searching for neighbors
[2020-07-21 12:55:24,698: INFO/MainProcess] mingle: all alone
[2020-07-21 12:55:24,711: INFO/MainProcess] pidbox: Connected to redis://:**@127.0.0.1:6379/0.
[2020-07-21 12:55:24,716: WARNING/MainProcess] d:envsintegration2libsite-packagesceleryfixupsdjango.py:206: UserWarning: Using settings.DEBUG leads to a
memory
            leak, never use this setting in production environments!
  leak, never use this setting in production environments!''')
[2020-07-21 12:55:24,717: INFO/MainProcess] celery@DESKTOP-GM453OA ready.

2.5 上面2.2中我们已经配置了定时任务,接下来我们要编写定时任务函数,和异步执行函数,

在你的app目录下面创建一个tasks.py文件(注意:只能要tasks),内容如下

from __future__ import absolute_import
from celery import shared_task

@shared_task
# 定义的定时任务函数
def auto_sc():
    print('sc test?')
    return 'halo'

# # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
# 定义的两个异步函数
@shared_task(name="send_sms")
def send_sms():
    print("发送短信!!!")
    return "s"


@shared_task(name="send_sms2")
def send_sms2():
    print("发送短信任务2!!!")
    print("p")
    return "p"

2.6 views.py 内容

from django.http import JsonResponse
from user import tasks


def deme_view(request):
    # 用delay方法运行函数,这里两个函数可以同时被调用,也就是并行
    result_one = tasks.send_sms.delay()
    result_two = tasks.send_sms2.delay()

    # 用get方法拿到返回的结果
    print(result_one.get())
    print(result_two.get())
    final_result = result_one.get() + result_two.get()

    return JsonResponse(
        {
            'code': 200,
            'message': 'success',
            'data': {
                'result': final_result
            }
        }
    )

===启动服务===

# 启动Django 服务
python manage.py runserver

# Linux下测试
Celery -A 项目名 worker -l info

# win 下启动
celery -A 项目名 worker -l info -P eventlet  

# 如果有定时任务 还需要启动
celery -A untitled beat -l info

================结果如下===============

96ff134551b819084dbf715d85c7a9da.png

参考连接:

Celery-4.1 用户指南: Task

以上就是Django中简单配置Celery,如果问题留言,会即使改正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值