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 os

def 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 os

def 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值