多进程编程疑问: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
相关产品推荐
相关产品推荐

