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

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

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

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开发异步编程中最常出现的问题:资源竞争。

总结:

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

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

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

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