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

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

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一条线程,当然如果武松兄弟来帮忙的话我们也完全可以改成多线程的异步出队模式。鲁达包子铺的生意真是越来越好了!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5659805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存