当前位置: 首页 > news >正文

python多线程和多进程——使用 concurrent.futures.ProcessPoolExecutor 和 ThreadPoolExecutor

在使用 concurrent.futures.ProcessPoolExecutor 和 ThreadPoolExecutor 时,如果你不指定 max_workers 参数,Python 会根据系统资源和任务类型自动选择一个合理的默认值。以下是关于这两个执行器的默认行为的详细说明:

ProcessPoolExecutor 默认值

对于 ProcessPoolExecutor,如果没有指定 max_workers 参数,默认值是你的机器上的 CPU 核心数。

from concurrent.futures import ThreadPoolExecutor
import os# 默认情况下,ThreadPoolExecutor 使用的线程数为 min(32, CPU核心数 + 4)
with ThreadPoolExecutor() as executor:print(f"Default max_workers: {executor._max_workers}")  # 注意:_max_workers 是内部属性,仅供调试查看cpu_cores = os.cpu_count()
default_max_workers = min(32, cpu_cores + 4)
print(f"Calculated default max_workers: {default_max_workers}")

因此,如果你有一个4核处理器,ProcessPoolExecutor 将默认创建4个工作进程。

ThreadPoolExecutor 默认值

对于 ThreadPoolExecutor,如果没有指定 max_workers 参数,默认值取决于 Python 版本:
Python 3.5 及更高版本(包括 Python 3.8+):
如果没有指定 max_workers,默认值为 min(32, os.cpu_count() + 4)。也就是说,默认的最大工作线程数是32和CPU核心数加4中的较小者。

from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import osdef print_default_values():# 获取CPU核心数cpu_cores = os.cpu_count()print(f"Number of CPU cores: {cpu_cores}")# ProcessPoolExecutor 默认值with ProcessPoolExecutor() as process_executor:print(f"ProcessPoolExecutor default max_workers: {process_executor._max_workers}")# ThreadPoolExecutor 默认值with ThreadPoolExecutor() as thread_executor:print(f"ThreadPoolExecutor default max_workers: {thread_executor._max_workers}")if __name__ == "__main__":print_default_values()

例如,如果你有4核处理器,默认的最大线程数将是 min(32, 4 + 4) = 8。
总结
ProcessPoolExecutor:默认最大工作进程数等于CPU核心数。
ThreadPoolExecutor:默认最大工作线程数为 min(32, CPU核心数 + 4)。

示例代码

以下是一个综合示例,展示了如何获取和打印这些默认值:

from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import osdef print_default_values():# 获取CPU核心数cpu_cores = os.cpu_count()print(f"Number of CPU cores: {cpu_cores}")# ProcessPoolExecutor 默认值with ProcessPoolExecutor() as process_executor:print(f"ProcessPoolExecutor default max_workers: {process_executor._max_workers}")# ThreadPoolExecutor 默认值with ThreadPoolExecutor() as thread_executor:print(f"ThreadPoolExecutor default max_workers: {thread_executor._max_workers}")if __name__ == "__main__":print_default_values()

http://www.mrgr.cn/news/94339.html

相关文章:

  • 解决leetcode第3455题最短匹配子字符串
  • 工具(十二):Java导出MySQL数据库表结构信息到excel
  • 小程序网络大文件缓存方案
  • 用DasViewer的时候3Dtiles 转osgb 可以直接指定目标坐标系吗?
  • 双指针算法专题之——复写零
  • 记录一个SQL自动执行的html页面
  • 求递增子序列LIS的两种方法
  • 深度学习正则化技术之权重衰减法、暂退法(通俗易懂版)
  • LangChain+InternLM2搭建知识库
  • 条款1:理解模版性别推导
  • Kubernetes教程(九)了解卷volume的emptyDir和hostPath
  • 将串口接收到的十六进制数据转为十进制
  • ⭐算法OJ⭐汉明距离【位操作】(C++ 实现)Hamming Distance
  • 【vue + JS】OCR图片识别、文字识别
  • 《基于大数据的营养果蔬推荐系统的设计与实现》开题报告
  • 在 Windows 上快速部署 OpenManus:从安装到运行
  • 计算机网络——DHCP实验
  • python -面试题--算法
  • RGV调度算法(三)--遗传算法
  • LeetCode 解题思路 15(Hot 100)