为什么要限并发度
提交一万个任务时要限住同时在跑的数量,因为【0】。
十个任务三个 worker
任务一大堆,闸门只放三个进去 里面满了三个,其余在门口等 提交 10 个任务、池 max_workers=3,会【0】。
一次最多几个在跑
(每道题开头都有同一段:上面的池小工具。) 贯穿全条的池小工具(标准库 ThreadPoolExecutor:固定 workers 个线程复用): pool_sum(fn, args, workers) 池对每个参数跑 fn,交回所
信号量也能限并发
(每道题开头都有同一段:上面的池小工具。) 没有池时,用一个信号量(Semaphore(n))也能限「同时最多 n 个」:每个任务开工前 acquire、干完 release,同时拿到许可的最多 n 个。这里用一个受锁保护的峰值计数器量一下
补全:算同时最多几个
(每道题开头都有同一段:上面的池小工具。) 贯穿全条的池小工具(标准库 ThreadPoolExecutor:固定 workers 个线程复用): 补全 peak(ntasks, workers):一次最多几个任务在跑(worker 和任务
补全:用信号量限并发
(每道题开头都有同一段:上面的池小工具。) 补全 gate(limit, ntasks):用 threading.Semaphore(limit) 让同时在跑的不超过 limit,跑 ntasks 个任务,交回 (峰值是否 <= li
⚠️ 自己写:不限并发会怎样
(每道题开头都有同一段:上面的池小工具。) 不限并发=所有任务一下全冲出去。补全 concurrent_now(ntasks, limit):limit 为 0 表示不限(同时在跑 = ntasks),否则同时在跑 = min(ntasks
池内部长什么样
线程池内部其实就是【0】。
worker 循环怎么写
池里每个 worker 的循环是【0】。
怎么让 worker 停
要让池里的 worker 停下来收工,办法是【0】。