异步方案 celery 发短信 && Python单例

本文介绍了Python中实现单例模式的两种方法,以及在Django项目中使用Celery进行异步任务处理,包括配置Celery、设置Redis为消息队列以及解决Windows环境下Celery的运行问题。同时,提到了Django中缓存策略,如缓存省市区数据以提高效率。

Python 单例方法


# 方式1  创建单例
class A:
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls, *args, **kwargs)
            
     	return cls._instance
    
    def goto(self,):
        print("cj>>>>>")
    
    
a = A()
print(id(a))  #2641366741704
b = A()
print(id(b))  #2641366741704
  
# 方式2  创建单例
class A:
    
    def __new__(cls, *args, **kwargs):
        if not hasattr(A, "_instance"):  # 是否有_instance属性
            cls._instance = super().__new__(cls, *args, **kwargs)
            
     	return cls._instance
    
    def goto(self,):
        print("cj>>>>>")            

使用单例 控制 只有一个短信发送对象

内存优化,减少内存消耗

使用pipline 操作redis

pl = redis.cli.pipeline()
pl.setex("send_flag_%s" % mobile, 60, 1)
pl.setex("sms_%s" % mobile, 300, sms_code)

# 5. 保存短信验证码到redis
# redis_cli.setex()
# 执行请求
pl.execute()	#一次执行,减少内存消耗

异步方案 celery 发短信

生产消费者模式

  • 安装celery创建sms 包,并添加异步

    pip install -U celery
    
  • 在根目录下 创建celery的包

    在这里插入图片描述

  • main.py

    • 1 设置django环境
      2 创建celery对象
      3 设置 broker
      4 celery自动检测任务
    import os
    
    # 1 设置django环境
    # set the default Django settings module for the 'celery' program.
    from celery import Celery
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo.settings')
    
    # 2 创建celery对象
    app = Celery('celery_tasks')
    
    # 3 设置 broker
    app.config_from_object("celery_tasks.config")
    
    # 4celery自动检测任务  这里会自动去celery_tasks.sms下找tasks.py
    app.autodiscover_tasks(['celery_tasks.sms'])
    
    
  • redis 作为队列

    • config.py
    # 把redis 作为队列
    broker_url = "redis://127.0.0.1/15"
    
    
    
  • sms的tasks.py里添加任务

    • tasks.py文件名不可改变

    在这里插入图片描述

启动celery
celery -A celery_tasks.main worker -l info

在这里插入图片描述

win10 遇到的小bug

开启服务发现,任务并未执行 上网查资料后发现,celery 对win10 支持并不是很好

解决此方案的

  • 方案1

  • 添加–pool=solo参数

    celery -A celery_tasks.main worker --pool=solo -l info
    
  • 方案2

  • 先安装gevent,然后在启动celery的时候添加gevent参数

    pip install gevent
    celery -A celery_tasks.main worker -l info -P gevent
    

参考资料:https://stackoverflow.com/questions/37255548/how-to-run-celery-on-windows

Django 地址设计

省市区三级联动
  • 缓存省市区数据

    提示:

    • 省市区数据是我们动态查询的结果。
    • 但是省市区数据不是频繁变化的数据,所以没有必要每次都重新查询。
    • 所以我们可以选择对省市区数据进行缓存处理。
  • 缓存方式

    • from django.core.cache import cache
    • 存储缓存数据:cache.set('key', 内容, 有效期)
    • 读取缓存数据:cache.get('key')
    • 删除缓存数据:cache.delete('key')
    • 注意:存储进去和读取出来的数据类型相同,所以读取出来后可以直接使用。
  • 缓存逻辑实现

    • 省份缓存数据
      • cache.set('province_list', province_list, 3600)
    • 市或区缓存数据
      • cache.set('sub_area_' + area_id, sub_data, 3600)
省级三联orm
# 查询所有省份
select * from tb_areas where parent_id is Null;

area_list = Area.objects.filter(parent=None)
Area.objects.filter(parent__isnull = True)

查询市级

select * from tb_areas where parent_id=130000; # 市
Area.objects.filter(parent_id = 130000)

area_hebei = Area.objects.get(id = 130000) 河北省
area_hebei.subs.all() 河北省所有的市

select * from tb_areas where parent_id=130200; #  区县
程序 = 数据结构 + 算法  程序是为了解决实际问题而存在的。然而为了解决问题,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实战算法,不是念PPT,我们讲的就是实战与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。 本视频由微软球最有价值专家尹成录制,拒绝念PPT,代码实战数据结构与算法导论。除了传统数据结构算法,加入高并发线程数据结构,分布式负载均衡算法,分布式哈希表,分布式排序等等现代算法。  算法,晦涩难懂,却又是IT领域受重视的素养之一。可以说,算法能力往往决定了一个程序员能够走多远。因此,BAT/FLAG等国内外各大名企非常喜欢在面试环节考核求职者的算法编程,这也成为了无数准程序员们过不去的一道“坎”。如何入门并成为一名出色的算法工程师?但无论半路出家还是科班出身,除学生时代搞算法竞赛的同学外真正用心学习过算法与数据结构太少太少。对于后期想要学习算法与数据结构却不得不面对以下问题:没有自己的知识框架,无法关联知识点,学习效率低有疑问而无人解答,有问题无法理解靠猜测,一个问题卡好几天市面上资料题解质量参差不齐,正确性未可知Google算法-工程师尹成大哥学习算法。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值