秒杀没成功,这是哪里错了,老师看一下。

来源:2-11 课堂练习:模拟商品秒杀活动案例(二)

慕设计7341579

2020-03-09 17:26:31

秒杀没成功没有全部写完就结束了,只写了十几条,有时写了二十几条

有如下提示:

http://img.mukewang.com/climg/5e660b5d09711e9a19201080.jpg

http://img.mukewang.com/climg/5e660b5d09812fe219201080.jpg

代码如下:

import random
from concurrent.futures import ThreadPoolExecutor
from redis_db import pool
import redis

s = set()
while True:
   if len(s) > 1000:
       break
   num = random.randint(10000, 100000)
   s.add(num)
con = redis.Redis(
   connection_pool=pool
)
try:
   con.flushdb()
   con.delete("kill_total", "kill_num", "kill_flag", "kill_user")
   con.set("kill_total", 50)
   con.set("kill_num", 0)
   con.set("kill_flag", 1)
   con.expire("kill_flag",600)
except Exception as e:
   print(e)
finally:
   del con

executor = ThreadPoolExecutor(200)

def buy():
   connection = redis.Redis(
       connection_pool=pool
   )
   pipline = connection.pipeline()
   try:
       if connection.exists("kill_flag")==1:
           pipline.watch("kill_num", "kill_user")
           total = int(pipline.get("kill_total").decode("utf-8"))
           num = int(pipline.get("kill_num").decode("utf-8"))
           if num < total:
               pipline.multi()
               pipline.incr("kill_num")   # 递增1
               user_id=s.pop()
               pipline.rpush("kill_user", user_id)
               pipline.execute()

   except Exception as e:
       print(e)
   finally:
       if "pipline" in dir():
           pipline.reset()
       del connection


for i in range(0, 1000):
   executor.submit(buy)

print("秒杀已经结束!")

写回答

1回答

时间,

2020-03-09

同学,你好。运行同学的代码是可以正常秒杀的,同学可以根据下述描述进行理解和操作

1、"too many connections"不是程序报错提示信息,属于Redis的日志提示。同学可以看下Redis数据库中的字段kill_user为50条记录和kill_num值为50即表示秒杀是成功的

2、当其他事务修改了watch的数据后,本事务因为未能正常execute,所以事务中关于修改秒杀商品数量的操作不会被提交执行,因此不会造成秒杀商品数量的减少。

3、线程池的任务是并发执行的,当并发往数据库里写数据时, 会出现数据存储不成功的情况

4、同学可以增加线程池数量或更换数据库后多尝试几次。

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

0

0 学习 · 2669 问题

查看课程