承上文: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开发异步编程中最常出现的问题:资源竞争。
总结:解决这个问题的方法很多,结合之前讲过的队列,在下一篇给大家实现用队列帮鲁智深走出困境。



