程序报错

程序报错

from redis_db import pool
import redis
import random
from concurrent.futures import ThreadPoolExecutor

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:
            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("秒杀已经结束")

相关截图:

https://img1.sycdn.imooc.com//climg/6194a1f409d1bad209521040.jpg


帮我看看为什么出现这种错误,而且还显示线程太多了,我都是按照视频里的代码写的啊

正在回答

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

1回答

同学,你好!

1、Too many connections是超过最大连接数,由于redis连接池过小导致的,当redis连接池最大连接数小于并发数时,多出来的并发数将会因为分配不到redis的资源而收到报错信息。可以将max_connections值设置为200

https://img1.sycdn.imooc.com//climg/6194b392098c8f3904020262.jpg

2、Watched variable changed:watch 执行之后, execute执行之前,有其他客户端修改了watch中指定的key的值, 程序的事务就会抛出异常 redis.WatchError

祝学习愉快!

  • 慕后端0234526 提问者 #1
    但是我这是按照视频里的代码写的为什么会出这样的错误,而且在redis数据库里只有kill_user有数据,其他三个都没有数据全是空的


    2021-11-17 15:56:26
  • 慕后端0234526 提问者 #2

    我改了程序后还是会出现Watched variable changed为什么视频里面没有,而且数据库里依然只有kill_user有数据,其他的都是空的



    2021-11-17 15:57:47
  • 好帮手慕美 回复 提问者 慕后端0234526 #3

    同学,你好。

    1、运行同学提交的代码是没有问题的。线程池的任务是并发执行的,这和cpu硬件有关系,因此同样的代码在不同机器中运行出现的问题可能是不一样的。

    https://img1.sycdn.imooc.com//climg/6194bd26091e2b4a01680166.jpg

    2、在程序开始时设置了相应的值,不会为空的,kill_flag设置了过期时间,过期之后就没有了

    https://img1.sycdn.imooc.com//climg/6194bcd40993ea2b03470126.jpg

    3、执行完程序后同学可以点击刷新重载数据库的键

    https://img1.sycdn.imooc.com//climg/6194bbde09d2805c03420187.jpg

    4、同学可以减少线程池数量或更换数据库后多尝试几次

    祝学习愉快!

    2021-11-17 16:28:35
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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