正在回答 回答被采纳积分+1
同学你好,
1、若注释con.delete(),数据库中的kill_user因是列表类型所以累加的
2、因不确定同学修改后的代码是否正确,如下是老师的代码,同学可以对比一下,user_id会出现少于50的情况,因是线程,哪个线程先执行完成也不确定,以下代码老师这边运行也是少于50的,另一位老师是50的
import redis
import random
from redis_db import pool
from concurrent.futures import ThreadPoolExecutor
# 用户id
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.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:
# 监视成功抢购数,成功抢购的ID
pipline.watch("kill_num", "kill_user")
# 商品总数
total = int(pipline.get("kill_total").decode("utf-8"))
print(total,"!!!!!!!!!")
# 成功抢购数
num = int(pipline.get("kill_num").decode("utf-8"))
if num < total :
pipline.multi()
pipline.incr("kill_num")
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("秒杀已经结束")
- 参与学习 人
- 提交作业 625 份
- 解答问题 2669 个
数据库作为企业储存和管理数据的根本,掌握数据库是每个开发工程师必备的技能,本阶段带你学会用Python操作MySQL、Redis和MongoDB三大主流数据库。夯实数据库基础。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星