谁是瓶颈

场景:~/积压/跑.py 里生产者每个 sleep 一小段、消费者每个也 sleep 一小段(时间写在代码里)。对照表列了八个角色名。 任务:读代码比较两边每个数据花的时间,找出更慢的那一方(瓶颈),到对照表里查它对应的标记。 可操作范围:

开始练习 →

给队列加上上限

场景:~/积压/坏.py 用 queue.Queue()(无界),生产快于消费,队列无限涨。说明里写了该用的上限 K。 任务:把队列改成有界 queue.Queue(maxsize=K)(满了 put 会阻塞=背压),让队列长度不再无限涨。

开始练习 →

满了丢了几个

场景:~/积压/日志.txt 记录了一次「满了就丢」(put_nowait)的运行:每行要么是入队的编号、要么是 DROP。对照表列了八个数。 任务:数出一共丢了多少个(DROP 的行数),到对照表里查那个数对应的标记。 可操作范围:只在分

开始练习 →

加消费者把积压追上

场景:~/积压/慢.py 只有 1 个消费者,追不上生产,处理很久才完(~/复现.sh 能看到它慢)。说明里写了要开几个消费者。 任务:把消费者改成说明里那么多个(多起几个消费者线程分着取),让它更快处理完、且总数仍正确。修好运行 ~/ch

开始练习 →

给生产者限速

场景:~/积压/坏.py 的生产者不管不顾地猛放,即使队列有界,生产者也几乎一直在被背压挡着空转日志刷屏。说明写了一个每轮 sleep 的节流值。 任务:给生产者每产一个之后加上说明里那个 time.sleep(...)(主动限速),让它和

开始练习 →

每秒积压涨多少

场景:~/积压/说明.txt 写了生产者每秒产出多少个、消费者每秒处理多少个(无界队列)。对照表列了八个数。 任务:算出队列每秒净涨多少个(产出速率减处理速率),到对照表里查那个数对应的标记。 可操作范围:只在分给你的这台实验机上操作。可以

开始练习 →

交付:一个不积压的生产者消费者

场景:要交付一个不会积压的生产者消费者,说明写了生产个数、队列上限 K、消费者个数 M。 任务:写 ~/积压/答.py:queue.Queue(maxsize=K)(有界背压);1 个生产者放说明里那么多个数据;M 个消费者线程处理;生产完

开始练习 →

线程池是什么

很多任务,交给固定的三个 worker 干完一个接下一个,线程反复用 线程池说的是【0】。

开始练习 →

为什么不每个任务开一个线程

很多任务,交给固定的三个 worker 干完一个接下一个,线程反复用 有一万个小任务,不给每个都开一个新线程,因为【0】。

开始练习 →

线程池解决什么

线程池主要解决两件事:【0】。

开始练习 →