You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多进程编程疑问:8核机器运行100个进程需限制并发数吗?

关于Python多进程并发数控制的问题

直接说结论:必须手动限制同时运行的最大进程数,Python的multiprocessing.Process不会自动识别CPU核心数并优化并发数量。

为什么要手动控制?

你的电脑是8核CPU,如果直接启动100个CPU密集型进程,操作系统会被迫在这些进程之间频繁切换上下文——每个进程只能分到极少量的CPU时间片,反而会大幅降低整体运行效率,甚至导致系统卡顿。

如果是IO密集型任务(比如频繁读写文件、调用API),并发数可以适当高于核心数(比如16-32),但100个依然过多,同样会带来不必要的进程调度开销。

推荐解决方案:使用进程池multiprocessing.Pool

进程池会帮你维护固定数量的工作进程,自动复用进程处理任务,避免频繁创建/销毁进程的开销,同时严格控制并发数。

针对你的代码,修改后的示例如下:

import multiprocessing
from multiprocessing import shared_memory
import pickle
import os

def run_func(shm_name, x, data_size):
    # 子进程连接共享内存
    existing_shm = shared_memory.SharedMemory(name=shm_name)
    # 反序列化数据
    pickled_df = existing_shm.buf[:data_size]
    df_data = pickle.loads(pickled_df)
    # 执行你的业务逻辑
    print(f"任务{x}执行中,进程ID: {os.getpid()}")
    # 关闭共享内存连接
    existing_shm.close()

if __name__ == '__main__':
    # 准备数据
    df_data = Somefunc()   
    pickled_df = pickle.dumps(df_data)
    size = len(pickled_df)

    # 创建共享内存
    shm = shared_memory.SharedMemory(create=True, size=size)
    shm.buf[:size] = pickled_df

    # 获取CPU核心数,作为进程池大小
    core_count = os.cpu_count()  # 你的机器会返回8
    # 使用进程池批量处理100个任务
    with multiprocessing.Pool(processes=core_count) as pool:
        # 生成100个任务的参数
        task_args = [(shm.name, x, size) for x in range(1, 101)]
        # 提交任务并等待完成
        pool.starmap(run_func, task_args)

    # 清理共享内存
    shm.close()
    shm.unlink()

其他注意事项

  • 如果你的任务是IO密集型,可以把进程池大小设置为core_count * 2或core_count * 4,具体根据实际测试调整。
  • 共享内存的处理要注意:每个子进程都要单独连接共享内存,处理完后关闭;主进程最后必须调用unlink()释放内存。
  • 避免手动创建100个Process对象并一次性启动,这种方式不仅效率低,还容易引发系统资源耗尽的问题。

内容的提问来源于stack exchange,提问作者mHelpMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:18:31