美文网首页
Django中celery的使用

Django中celery的使用

作者: Bobi_He | 来源:发表于2020-09-05 17:24 被阅读0次
自己的项目需要使用异步发送消息,看了网上很多的文章,一个一个的看或者跟着敲,花了很多时间都没有搞出来,最后试出来了方法,这里记录一下.

首先是下载需求的包

pip install celery  # 直接最新版,没什么要求
pip install redis==3.3.0
pip install gevent  # 这个是用来在win10上开启celery的,因为celery4.0以上不支持windows
# 我的django版本是1.11

目录结构:

1599297178(1).png

1.在项目最外层,也就是跟项目同名称包的同级创建一个包MyCelery(这个随便取名字).
2.在MyCelery下创建config.py文件,文件代码:

broker_url = 'redis://127.0.0.1:6379/15'
result_backend = 'redis://127.0.0.1:6379/14'
# 主要来配置中间件和结果存储地

3.在MyCelery下创建main.py文件,文件代码:

# 主程序
import os
import django
from celery import Celery

# 创建celery实例对象
app = Celery("sms")

# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoCelery.settings")
django.setup()

# 通过app对象加载配置
app.config_from_object("MyCelery.config")

# 加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["MyCelery.sms", ])

4.在MyCelery下创建一个包,包名随便取,这个包的意思就是任务数,可以创建无数个这样同类似的包,只需要在main.py中备注就ok. 然后再包中创建tasks.py文件,文件名必须是tasks.py不能有所改变,这是存放自己的任务的文件,代码:

# celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!!
from MyCelery.main import app
import time

import logging

log = logging.getLogger("django")


@app.task  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
def send_sms(mobile):
    """发送短信"""
    print("向手机号%s发送短信成功!" % mobile)
    time.sleep(5)

    return "send_sms OK"


@app.task  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
def send_sms2(mobile):
    print("向手机号%s发送短信成功!" % mobile)
    time.sleep(5)

    return "send_sms2 OK"

5.在视图中调用任务:

from django.http import HttpResponse
from django.views import View
from datetime import timedelta
from datetime import datetime
from MyCelery.sms.tasks import send_sms


class IndexView(View):
    def get(self, request, *args, **kwargs):
        ctime = datetime.now()
        utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
        time_delay = timedelta(seconds=10)
        task_time = utc_ctime + time_delay
        result = send_sms.apply_async(["911", ], eta=task_time)
        print(result.id)
        return HttpResponse('ok')
# 这里做的是定时任务,10S后发送

必须先启动celery,才能调用,只要任务有所改变都要重新启动celery,windows启动celery的方法:

celery -A MyCelery.main worker -l info -P gevent

启动之后是下图这样,证明开启celery任务成功,就可以在视图中调用了

1599297793(1).png

相关文章

网友评论

      本文标题:Django中celery的使用

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