Python 多处理:处理 2000 个进程

Pra*_*ewa 2 python multithreading multiprocessing python-multithreading python-3.x

以下是我的多处理代码。regressTuple 有大约 2000 个项目。因此,以下代码创建了大约 2000 个并行进程。运行此程序时,我的 Dell XPS 15 笔记本电脑崩溃了。

  1. python多处理库不能根据硬件可用性来处理队列并在最短的时间内运行程序而不崩溃吗?我这样做不正确吗?
  2. python 中是否有 API 调用来获取可能的硬件进程数?
  3. 如何重构代码以使用输入变量来获取并行线程计数(硬编码)并多次循环线程直至完成- 这样,经过几次实验,我将能够获得最佳线程计数。
  4. 在最短的时间内运行此代码而不崩溃的最佳方法是什么?(我不能在我的实现中使用多线程)

特此我的代码:

regressTuple = [(x,) for x in regressList]
processes = []

for i in range(len(regressList)):                  
    processes.append(Process(target=runRegressWriteStatus,args=regressTuple[i]))

for process in processes: 
    process.start() 

for process in processes:
    process.join()
Run Code Online (Sandbox Code Playgroud)

Roh*_*hit 5

我们需要记住很多事情

  1. 旋转进程的数量不受系统上内核数量的限制,而是受ulimit系统上的用户 ID 的限制,系统上的用户 ID 控制由您的用户 ID 启动的进程总数。

  2. 核心数量决定了有多少个已启动的进程实际上可以同时并行运行。

  3. 系统崩溃可能是由于这些进程正在运行的目标函数正在执行繁重且资源密集型的操作,当多个进程同时运行或系统nprocs限制已耗尽且现在内核不可用时,系统无法处理该功能能够启动新的系统进程。

话虽这么说,生成多达 2000 个进程也不是一个好主意,即使您有一台 16 核 Intel Skylake 机器,因为在系统上创建新进程并不是一项轻量级任务,因为有很多事情比如生成 pid、分配内存、生成地址空间、调度进程、上下文切换以及管理后台发生的整个生命周期。所以内核生成一个新进程是一个繁重的操作,

不幸的是,我猜你正在尝试做的是 CPU 密集型任务,因此受到机器上硬件的限制。运行比系统上核心数量更多的进程根本没有帮助,但创建进程池可能会有所帮助。因此,基本上您希望创建一个具有与系统上的核心数量相同数量的进程的池,然后将输入传递到池中。像这样的东西

def target_func(data):
    # process the input data

with multiprocessing.pool(processes=multiprocessing.cpu_count()) as po:
    res = po.map(f, regressionTuple)
Run Code Online (Sandbox Code Playgroud)