单个多核机器上的多个Python脚本

单个多核机器上的多个Python脚本,python,multicore,Python,Multicore,我有一个python脚本,它具有很高的运行时间(在单个虚拟核心机上测试单个脚本时需要4天),可以根据我们提供的输入参数处理一些文件列表 我想要测试的参数列表非常长,并且由于基础设施的高成本,按顺序运行每个参数是不可行的 因此,我尝试在我的12核机器上使用不同的参数独立运行脚本,例如 nohup python script.py 1 & nohup python script.py 2 & 再这样8次。。考虑到每个进程将独立地分配给每个核心,2个核心将处于备用状态,因为脚本将在其

我有一个python脚本,它具有很高的运行时间(在单个虚拟核心机上测试单个脚本时需要4天),可以根据我们提供的输入参数处理一些文件列表

我想要测试的参数列表非常长,并且由于基础设施的高成本,按顺序运行每个参数是不可行的

因此,我尝试在我的12核机器上使用不同的参数独立运行脚本,例如

nohup python script.py 1 &
nohup python script.py 2 &
再这样8次。。考虑到每个进程将独立地分配给每个核心,2个核心将处于备用状态,因为脚本将在其上工作的文件中没有重叠,任何竞争条件或死锁都不会发生,因为我们传递给所有脚本的参数是不同的,因此GIL没有问题


我所观察到的是,单独的python脚本并没有以类似的速度运行,也没有按照前面提到的时间线运行,所有十个不同的进程都应该在4天内完成,但已经有14天了,但只有一些线程已经完成,而这也仅仅在过去的1-2天内完成。 从生成的日志文件中可以看出,其余的进程都落后了


有人能帮我理解python的这种行为吗?

我建议首先尝试描述和了解更多关于您的程序及其性能的信息:

您可以从Python line profiler开始,它用于查看脚本中每行代码的运行速度和频率

pip install line_profiler
一旦计时,就可以开始分析内存了

pip install -U memory_profiler
pip install psutil
查找“内存泄漏”的最快方法是使用一个名为objgraph的很棒的工具。该工具允许您查看内存中对象的数量,还可以定位代码中包含这些对象引用的所有不同位置

pip install objgraph
一旦您理解了脚本的每一部分,您能描述更多关于代码性质的信息吗?另外,请阅读前一篇文章的摘录:

“为了利用多核(或多处理器)计算机,您需要一个以并行方式编写的程序,以及一个允许程序在多核(和操作系统)上实际并行执行的运行时(尽管您可以在PC上运行的任何操作系统都会这样做)。这是真正的并行编程,尽管并行编程有不同的方法。与Python相关的是多处理和多线程。”


“所有十个不同的流程都应该在4天内完成”你确定吗?你是分开经营的吗?它们是否依赖于某些可能限制处理速度的公共资源?是的,我知道它们所依赖的文件列表,并且它们都是不同的。它们之间没有共同的文件/资源。只有在编写糟糕的程序中,或者在计算量大(气象或海洋模型)时,处理器才是瓶颈。如果在一台多核机器上启动多个进程并没有提高多少速度,那么您应该想知道您的处理是否是IO或内存限制,而不是处理器限制。据我所知,代码编写得很好,因此不会出现死锁或开销。脚本确实有IO操作,但内存不太大。它读取的csv大小约为160-200 kb,最多有20K行。在给定时间,它读取这些文件时,会将结果存储在内存中,然后移动到另一个文件,并且所有脚本只读取24-29个文件。生成的结果也不是那么大,最多只有大约200kb的文件。计算是在以前读入内存的行上完成的,仅此一行就需要大量时间。有多少个文件?您可以提供哪些类型的操作的详细信息?