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

本文通过讲述鲁智深包子铺的故事,揭示了资源竞争在并发编程中的问题,例如在多线程环境下,简单的加减操作可能会因线程交错导致错误结果。通过引入队列,可以有效地避免此类问题,确保任务的有序执行。下篇将介绍如何利用队列帮助鲁智深改进他的包子分配流程。

 承上文:python ---- 结合redis实现队列

业务描述:

        鲁智深是包子铺老板,这天早上来买包子的人很多;大家一股脑涌了上去,鲁智深忙的不可开交。突然铺子外边有两人吵闹着走了起来,原来是李逵要了一屉韭菜鸡蛋馅儿的包子,张清要了一屉葱花羊肉馅儿的;鲁智深因为太忙了给错了,把韭菜鸡蛋馅儿的给了张清,葱花羊肉馅儿的给了李逵,两人出门一看不对啊就回来找鲁智深理论了。

问:在这个场景中,怎么帮鲁智深避免这种问题?

首先:

        这个场景就是典型的资源竞争导致的乱象,鲁智深因为来买包子的人太多又是一拥而上导致记不清谁要的什么馅儿的包子从而把给两人的包子弄反了。

在web开发中这种问题非常常见,再来个直观的列子:

num = 0  
def worker():
    global num  # 声明修改全局变量
    for i in range(1000000):
        num += 5
        num -= 5
worker()
print(num)  # 0

显而易见:

        理论上不管执行多少次这个worker方法,最终的结果都是0。所以,再来看一段代码:

import threading
# 生成多线程容器
threads = [threading.Thread(target=worker) for i in range(50)]
[x.start() for x in threads]  # 执行多线程
[x.join() for x in threads]  # 阻塞主线程
print(num)  # -15

???问题来了,为什么多线程执行的情况下结果不是0。其实大家再结合上边鲁智深卖包子的问题那么就不难理解了,程序在执行到-5的时候可能被别的线程一挤,鬼使神差的执行了+5,这就是web开发异步编程中最常出现的问题:资源竞争。

总结:

        解决这个问题的方法很多,结合之前讲过的队列,在下一篇给大家实现用队列帮鲁智深走出困境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值