消费者要等
场景:~/流水/流水.py 生产者慢慢放 N 件、消费者取 N 件。现在消费者一上来就取,队列还是空的——报错,最后打印「取到 0 件」。 任务:让消费者「等到有货再取」——用 threading.Condition(wait_for /
最多三个同时
场景:~/下载/下载.py 开十来条线程各打开一个连接,打印「峰值 P 完成 N」——现在峰值等于线程数,服务器受不了。 任务:用 threading.Semaphore(或 BoundedSemaphore)把同时打开的连接限到 LIMI
交付:三处锁的毛病一起修
场景:~/账本/账本.py 做三件事:转账、审计、递归合计。里面有三处锁的毛病:没锁的、拿了不放的、自己等自己的——跑起来卡住,就算不卡总额也不对。说明.txt 写了三个应有的数。 任务:都修好,让它退出并打印正确的「总额 T 完成 K 合
先量什么
怀疑一个多线程程序「锁太粗」,真机上第一步该量的是【0】。
从耗时认粗细
三个版本各打印「卖出 K 耗时 T」,库存 2。用规则「结果对且最快 = 刚好;结果对但慢 = 太粗;结果错 = 太细」分类: runs = {"甲": (2, 1.21), "乙": (4, 0.3
锁里那个耗时的函数
场景:~/统计/统计.py 开四条线程各算一项、加进合计,结果对,可是要跑两秒。对照表列了八个名字。 任务:找出被关在锁里、其实不碰共享数据的那个耗时函数,到对照表里查它的名字对应的标记。 可操作范围:只在分给你的这台实验机上操作。可以改家
把耗时的活挪出锁
场景:同上的 ~/统计/统计.py,四条线程各算 0.5 秒,要跑两秒。 任务:改成「算在锁外、只把加进合计关在锁里」,让它 1.3 秒内跑完、合计还是 30。规则:不许删锁、不许改 WORK、不许少算。改好运行 ~/check(它会计时)
哪个函数把检查和动作拆开了
场景:~/库存/库存.py 三个碰库存的函数都是「先检查、再动作」。有一个把检查和动作拆成了两次持锁——跑起来超卖。对照表列了八个名字。 任务:找出那个函数,到对照表里查它的名字对应的标记。 可操作范围:只在分给你的这台实验机上操作。可以改
把检查和动作合回一次持锁
场景:同上的 ~/库存/库存.py,超卖。说明.txt 写了库存数。 任务:把拆开的函数合回「检查和动作在同一次持锁里」,让它每次都打印正确的「卖出 S」。规则:不许删 sleep、不许改库存和买家数。修好运行 ~/check(跑 3 次)
一把大锁拆成每键一把
场景:~/计数/计数.py 四个键各一条线程,各加几次(读-睡-写)。一把大锁保护整个字典——四条线程改的是不同的键,却在同一把锁上排队。 任务:改成每个键一把自己的锁(锁分片),让它 1.1 秒内跑完,结果不变。规则:不许删 sleep、