为啥线程数不同,秒杀结果不同,好想知道这个具体原理啊.麻烦老师解答一下.具体看以下代码和截图
import redis
import random
from concurrent.futures import ThreadPoolExecutor
# 模拟抢购
pool = redis.ConnectionPool(host='localhost', port=6379, password=123, db=0, max_connections=20)
con = redis.Redis(connection_pool=pool)
con_buy = redis.Redis(connection_pool=pool)
# Python 线程池
executor = ThreadPoolExecutor(200)
def get_user_id():
""" 创建user id 的集合"""
s = set()
while True:
if len(s) == 1000:
break
num = random.randint(100000, 999999)
s.add(num)
return s
def buy():
""" 模拟购买场景 """
try:
pipline = con_buy.pipeline()
if con_buy.exists('kill_flag') == 1:
pipline.watch('kill_flag', 'kill_user')
total = int(pipline.get('kill_total').decode('utf-8'))
# print(total)
num = int(pipline.get('kill_num').decode('utf-8'))
# print(num)
if num < total:
pipline.multi()
pipline.incr('kill_num')
s = get_user_id()
user_id = s.pop()
pipline.rpush('kill_user', user_id)
pipline.execute()
print('第{0}个秒杀成功,总共有{1},还有{2}个'.format(num+1, total, total-num-1))
# except Exception as e:
# print(e)
finally:
pipline.reset()
def main():
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)
for i in range(1000):
executor.submit(buy)
print("秒杀结束")
except Exception as e:
print(e)
# finally:
# # del con
# del con_buy
if __name__ == '__main__':
main()




我之前用200个线程总是抢不完, 换了线程总数,终于可以了,然后就测试了一下,发现,不同的线程数,结果截然不同.这是为啥呢??麻烦老师解答一下.以上的代码只是在线程数那里做了修改,其它地方都没改变.我的数据库也是和这个打印效果完全一样..
12
收起
正在回答 回答被采纳积分+1
3回答
2.Python操作三大数据库
- 参与学习 人
- 提交作业 625 份
- 解答问题 2669 个
数据库作为企业储存和管理数据的根本,掌握数据库是每个开发工程师必备的技能,本阶段带你学会用Python操作MySQL、Redis和MongoDB三大主流数据库。夯实数据库基础。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星