以下是我的多处理代码。 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()
答案 0 :(得分:1)
- python多处理库不能根据硬件可用性处理队列并运行程序而不会崩溃 最短的时间?我这样做不正确吗?
我不认为管理队列长度是python的责任。当人们伸手进行多处理时,他们往往希望提高效率,将系统性能测试添加到运行队列将是一项开销。
- python中是否有API调用来获取可能的硬件进程计数?
如果有,它会提前知道您的任务需要多少内存吗?
- 如何重构代码以使用输入变量来获取并行线程计数(硬编码)并通过多个线程进行循环 直到完成的次数-这样,经过几次实验,我将 能够获得最佳线程数。
正如鲍德曼指出的那样,游泳池是解决这一问题的好方法。
- 在最短的时间内运行该代码而不崩溃的最佳方法是什么。 (我无法在实现中使用多线程)
使用一个池,或占用可用的系统内存,除以〜3MB,然后查看一次可以运行多少个任务。
这可能更像是sysadmin任务,以平衡瓶颈和队列长度,但是通常,如果您的任务受IO约束,那么如果所有任务都在等待,那么长队列就没有多大意义了。一条相同的T形路口变成了道路。然后,这些任务将相互争夺下一个IO块。
答案 1 :(得分:1)
我们需要记住很多事情
纺丝进程数不受系统上内核数的限制,而是由系统上用户ID的ulimit
来控制由用户ID启动的进程总数。 / p>
核的数量决定了实际上一次可以并行运行的启动进程有多少。
您的系统崩溃可能是由于这些进程正在运行的目标函数正在做大量且占用大量资源的事实,当多个进程同时运行或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)