秒杀没成功,这是哪里错了,老师看一下。
来源:2-11 课堂练习:模拟商品秒杀活动案例(二)
慕设计7341579
2020-03-09 17:26:31
秒杀没成功没有全部写完就结束了,只写了十几条,有时写了二十几条
有如下提示:


代码如下:
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、同学可以增加线程池数量或更换数据库后多尝试几次。
如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~
相似问题