[英]Python multiprocessing: dealing with 2000 processes
以下是我的多处理代码。 regressTuple大约有2000个项目。 因此,以下代码创建了大约2000个并行进程。 我的Dell xps 15笔记本电脑在运行时崩溃。
特此将我的代码:
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()
- python multiprocessing库不能根据硬件可用性处理队列并运行程序而不会在最短时间内崩溃吗? 我这样做不正确吗?
我认为管理队列长度不是python的责任。 当人们伸手进行多处理时,他们往往希望提高效率,将系统性能测试添加到运行队列将是一项开销。
- python中是否有API调用来获取可能的硬件进程计数?
如果有,是否会提前知道您的任务将需要多少内存?
- 我如何重构代码以使用输入变量来获取并行线程计数(硬编码)并遍历线程多次直到完成-这样,经过几次实验,我将能够获得最佳线程计数。
正如balderman指出的那样,游泳池是解决这一问题的好方法。
- 在最短的时间内运行该代码而不会崩溃的最佳方法是什么。 (我无法在实现中使用多线程)
使用一个池,或占用可用的系统内存,除以〜3MB,然后查看一次可以运行多少个任务。
这可能更像是sysadmin任务,以平衡瓶颈和队列长度,但是通常,如果您的任务受IO约束,那么如果所有任务都在同一时间等待,那么长任务队列就没有多大意义了。丁字路口转成路。 然后,这些任务将为下一个IO块相互竞争。
我们需要牢记许多事情
旋转进程数不受系统上内核数的限制,而是系统上用户ID的ulimit
,它控制由用户ID启动的进程总数。
内核数量决定了实际上一次可以并行运行的启动进程中有多少个。
系统崩溃的原因可能是由于这些进程正在运行的目标函数正在做大量的事情且占用大量资源,当多个进程同时运行或系统的nprocs
限制用尽并且现在内核处于运行状态时,该系统无法处理无法旋转新的系统进程。
话虽如此,即使您拥有16核Intel Skylake机器,生成多达2000个进程也不是一个好主意,因为在系统上创建新进程并不是一件轻量的任务,因为有很多事情例如生成pid,分配内存,生成地址空间,调度进程,上下文切换以及管理后台发生的整个生命周期。 因此,内核生成新进程是一项繁重的操作,
不幸的是,我想您要执行的任务是CPU限制的任务,因此受到计算机硬件的限制。 旋转数量超过系统核心数量的进程完全无济于事,但是创建进程池可能会有所帮助。 因此,基本上,您想创建一个池,该池具有与系统上具有核心数量一样多的进程,然后将输入传递给池。 像这样
def target_func(data):
# process the input data
with multiprocessing.pool(processes=multiprocessing.cpu_count()) as po:
res = po.map(f, regressionTuple)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.