美文网首页
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