代码最后一句调用buy函数的问题
import random import redis 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_user", "kill_flag") 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") 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("秒杀结束")
关于最后executor.submit函数,在线程池同为200的情况下,
如果调用executor.submit(buy)
,则会出现连接过多,然后商品没有卖完的情况,
如果调用executor.submit(buy())
,则不会出现连接过多,然后卖不完的情况,每次都能按照预期卖完50件商品。
请问这两个调用区别是啥?
10
收起
正在回答
1回答
同学,你好。
1、buy和buy():buy是函数的引用, buy()是调用buy函数
2、submit():传入的第一个参数应为需要执行的函数,而不是函数调用。
3、出现的"too many connections"不是程序报错提示信息,属于Redis的日志提示。关于提示信息可在捕获异常后不进行打印输出。
4、当其他事务修改了watch的数据,若线程中的事务未能正常execute,即修改秒杀商品数量的操作不会被提交执行,因此不会造成秒杀商品数量的减少。同学可以更换数据库多测试几次。
如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~
2.Python操作三大数据库
- 参与学习 人
- 提交作业 625 份
- 解答问题 2669 个
数据库作为企业储存和管理数据的根本,掌握数据库是每个开发工程师必备的技能,本阶段带你学会用Python操作MySQL、Redis和MongoDB三大主流数据库。夯实数据库基础。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星