代码最后一句调用buy函数的问题

代码最后一句调用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件商品。


请问这两个调用区别是啥?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好。

1、buy和buy():buy是函数的引用, buy()是调用buy函数

2、submit():传入的第一个参数应为需要执行的函数,而不是函数调用。

3、出现的"too many connections"不是程序报错提示信息,属于Redis的日志提示。关于提示信息可在捕获异常后不进行打印输出。

http://img1.sycdn.imooc.com//climg/5dba7bdf0964372206570300.jpg

4、当其他事务修改了watch的数据,若线程中的事务未能正常execute,即修改秒杀商品数量的操作不会被提交执行,因此不会造成秒杀商品数量的减少。同学可以更换数据库多测试几次。

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

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师