在使用 concurrent.futures.ProcessPoolExecutor 和 ThreadPoolExecutor 时,如果你不指定 max_workers 参数,Python 会根据系统资源和任务类型自动选择一个合理的默认值。以下是关于这两个执行器的默认行为的详细说明:
ProcessPoolExecutor 默认值
对于 ProcessPoolExecutor,如果没有指定 max_workers 参数,默认值是你的机器上的 CPU 核心数。
python">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中的较小者。
python">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)。
示例代码
以下是一个综合示例,展示了如何获取和打印这些默认值:
python">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()