美文网首页
Django+Celery+Redis 使用

Django+Celery+Redis 使用

作者: 朱佩奇被占用 | 来源:发表于2020-06-22 21:29 被阅读0次

    pip install django==2.1.4
    pip install redis==3.2.0
    pip install celery==4.4.2
    pip install eventlet # celery 4.0+版本以后不支持在windows运行,还需额外安装eventlet库

    settings.py配置

    CELERY_BROKER_URL = 'redis://localhost'
    CELERY_ACCEPT_CONTENT = ['json']
    CELERY_RESULT_BACKEND = 'redis://localhost'
    CELERY_TASK_SERIALIZER = 'json'
    
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",  # 这里设定了本机的redis数据
            # "LOCATION": "redis://:passwordpassword@47.193.146.xxx:6379/0", # 如果redis设置密码的话,需要以这种格式host前面是密码
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    
    

    在同级目录下还需要添加celery.py文件

    from __future__ import absolute_import, unicode_literals
    import os
    from celery import Celery
    
    # 指定Django默认配置文件模块
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'linfen.settings')
    
    # 为我们的项目myproject创建一个Celery实例。这里不指定broker容易出现错误。
    app = Celery('linfen', broker='redis://127.0.0.1:6379/0')
    
    # 这里指定从django的settings.py里读取celery配置
    app.config_from_object('django.conf:settings')
    
    # 自动从所有已注册的django app中加载任务
    app.autodiscover_tasks()
    
    
    # 用于测试的异步任务
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

    在settings.py 同级的init.py 写入下面内容 确保项目启动时即加载Celery实例:

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

    在模块中添加tasks.py

    from celery import Celery, shared_task
    
    @shared_task(bind=True)
    def insert_search_result(self, search):
        if search:
            search_id = search['search_id']
            cday = search['cday']
            json_search = search['json_search']
            td_len = search['td_len']
            sr = SearchResult()
            sr.search_id = search_id
            sr.createtime = cday
            sr.req = json_search
            sr.result_size = td_len
            sr.save()
            return True
        else:
            return False
    
    

    最后可在其他文件中调用此任务函数,以达到异步:

    isr = tasks.insert_search_result.delay(search_dic)
    

    启动redis 和django 然后打开terminal 输入如下内容 启动worker:

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

    更具体的介绍可以参考https://zhuanlan.zhihu.com/p/139951976?utm_source=wechat_session&utm_medium=social&utm_oi=902276942420668416

    相关文章

      网友评论

          本文标题:Django+Celery+Redis 使用

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