栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python ---- 队列实现一个简单的业务(二)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python ---- 队列实现一个简单的业务(二)

承上文:python ---- 队列实现一个简单的业务(一)

还原场景:
import threading  # 多线程
# 鲁达包子铺
def luzhishen(user, num, money):
    print("%s:老板我要%d个包子,这是%d块您收好。" % (user, num, money))
    print("鲁智深:给您的%d个包子,您慢走。" % num)
def my_worker():
    for i in range(100000):
        luzhishen("李逵", 1, 3)
        luzhishen("张清", 2, 6)
# 创建多线程容器
threads = [threading.Thread(target=my_worker) for i in range(50)]
[i.start() for i in threads]  # 开启多线程
[i.join() for i in threads]  # 阻塞主线程

这是结果:(鲁智深懵了⊙▃⊙)

那么,怎么帮鲁智深一劳永逸呢?

引入队列:

在my_worker方法中不是直接调用luzhishen方法,而是将用户入队。

import threading
import redis
import json
def my_worker()->None:
    r = redis.Redis(decode_responses=True)
    key = "luzhishen"
    for i in range(100000):
        # 在头部加入数据
        r.lpush(key, json.dumps({"user": "李逵", "num": 1, "money": 3}))
        r.lpush(key, json.dumps({"user": "张清", "num": 2, "money": 6}))
threads = [threading.Thread(target=my_worker) for i in range(50)]
[i.start() for i in threads]
[i.join() for i in threads]

虽然依旧是高并发,但是在队列中每个任务总是会有先后顺序的。随后,新建一个py文件:

import redis
import json
key = "luzhishen"
def luzhishen(user: str, num: int, money: int)->None:
    print("%s:老板我要%d个包子,这是%d块您收好。" % (user, num, money))
    print("鲁智深:给您的%d个包子,您慢走。" % num)
def my_worker()->None:
    while True:
        r = redis.Redis(decode_responses=True)
        user = r.rpop(key)
        if user:
            user = json.loads(user)
            luzhishen(user["user"], int(user["num"]), int(user["money"]))
        else:
            print("没人要买包子了")
if __name__ == '__main__':
    my_worker()

马上,鲁智深的包子铺又恢复秩序了。

总结:

考虑到店主只有鲁智深一人,那么出队就只有while True一条线程,当然如果武松兄弟来帮忙的话我们也完全可以改成多线程的异步出队模式。鲁达包子铺的生意真是越来越好了!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/656093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号