多线程的数量设定

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
CPU核数为4核,一个任务线程cpu耗时为20ms,线程等待(网络IO、磁盘IO)耗时80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20。也就是设置20个线程数最佳。

线程的等待时间越大,线程数就要设置越大

1、CPU密集型:操作内存处理的业务,一般线程数设置为:CPU核数 + 1 或者 CPU核数*2。核数为4的话,一般设置 5 或 8

2、IO密集型:文件操作,网络操作,数据库操作,一般线程设置为:cpu核数 / (1-0.9),核数为4的话,一般设置 40

### Python 中多线程数量限制与设置 在 Python 编程环境中,`threading` 模块提供了 `Semaphore` 类和 `BoundedSemaphore` 类用于控制并发线程的最大数目[^2]。这些工具能够有效地防止过多的线程同时运行而导致系统资源耗尽。 #### 使用 Semaphore 控制线程数 为了实现对启动线程数量的有效管理,可以通过创建一个固定大小的信号量对象,在每个工作线程开始之前获取该信号量,并在线程完成其任务之后释放它: ```python import threading import time def worker(semaphore): with semaphore: print(f'Thread {threading.current_thread().name} is working.') time.sleep(1) max_workers = 5 semaphore = threading.Semaphore(max_workers) threads = [] for i in range(10): t = threading.Thread(target=worker, args=(semaphore,)) threads.append(t) t.start() for t in threads: t.join() ``` 上述代码展示了如何利用 `Semaphore` 来限定最多只有五个线程能同时处于活跃状态。当超过这个限额时,其他试图获得锁的工作线程将会被阻塞直到有可用的位置为止。 #### 动态调整最大线程数 如果希望动态改变可允许的最大线程数,则可以在程序的不同阶段重新初始化新的 `Semaphore` 实例或者使用更高级别的抽象库如 `concurrent.futures` 下面的 `ThreadPoolExecutor`,后者支持更加灵活的任务提交机制以及内置了对线程池大小的支持: ```python from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=5) as executor: futures = [executor.submit(worker) for _ in range(10)] # 可选:等待所有任务结束 for future in futures: try: result = future.result(timeout=30) except Exception as exc: print('Task generated an exception:', exc) ``` 这段代码片段说明了怎样借助于 `ThreadPoolExecutor` 更加简便地管理和分配有限数量的工作线程给待处理的任务列表[^4]。 #### 防止过度消耗资源 除了设定固定的上限外,还应该考虑实际硬件条件下的最佳实践。例如,监控当前活动线程计数 (`active_count`) 并据此决定是否继续新增更多线程也是一个不错的选择。这有助于避免因一次性开启太多线程而引发性能瓶颈或内存溢出的风险[^3]: ```python while threading.active_count() > 80: time.sleep(1) ``` 此段逻辑会在现有活跃线程达到八十以上的时候暂停主线程一段时间再尝试检查一次,以此循环直至满足条件才继续向下执行。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值