以下是我的多处理代码。Regresstuple有大约2000个项目。因此,以下代码创建了大约2000个并行过程。运行时,我的戴尔XPS 15笔记本电脑崩溃。
- python多处理库不能根据硬件可用性处理队列,并且在最少的时间内崩溃而不崩溃而运行该程序?我不是正确地做吗?
- Python中是否有API调用以获取可能的硬件过程计数?
- 如何重构代码使用输入变量以获取并行线程计数(硬编码)并通过线程循环几次,直到完成 - 这样,几乎没有实验,我将能够获得最佳的线程计数。
- 什么是在最少的时间内运行此代码而不会崩溃的最佳方法。(我在实施中不能使用多线程)
我的代码:
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()
我们需要牢记多个事情
-
旋转过程的数量不受系统上的核心数量的限制,而是系统上用户ID的
<</p>ulimit
,以控制用户ID启动的流程总数。 -
核心的数量确定实际上可以并行运行多少这些过程。
-
系统崩溃可能是由于您的目标函数所运行的目标功能正在做重量和资源密集型的事情,当多个进程同时运行时,系统无法处理,或者系统上的
nprocs
限制筋疲力尽,现在内核无法旋转新的系统流程。
说,即使您拥有16个核心Intel Skylake Machine,多达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)
- 不能根据硬件可用性为python多处理库处理队列,并在不崩溃的情况下运行程序 很少的时间?我不是正确地做吗?
我认为管理队列长度不是Python的责任。当人们接触多处理时,他们倾向于需要效率,在运行队列中添加系统性能测试将是一个开销。
- Python中是否有API调用以获取可能的硬件过程计数?
如果有的话,它会提前知道您的任务需要多少内存?
- 如何重构代码以使用输入变量以获取并行线程计数(硬编码)并通过线程循环多个 到完成的时间 - 这样,经过几次实验,我将是 能够获得最佳的线程计数。
正如巴尔德曼(Balderman)指出的那样,一个游泳池是一个很好的途径。
- 什么是在最少的时间内运行此代码而不会崩溃的最佳方法。(我在实施中不能使用多线程)
使用池或采用可用的系统内存,除以〜3MB,看看您可以一次运行多少个任务。
这可能更像是一项sysadmin任务,可以平衡瓶颈与队列长度,但是通常,如果您的任务是io绑定的,那么如果所有任务都在等待,那么长期任务排队就没有多大意义。相同的T结构可以转向道路。然后,任务将在IO的下一个块中相互战斗。