降低多处理的进程优先级.Pool在Windows上

时间:2014-04-14 12:42:32

标签: python python-2.7 pandas multiprocessing

我使用multiprocessing.Pool()来并行化一些繁重的Pandas处理,但发现它有点太成功了。我的CPU使用率达到100%,我的整台计算机变得非常无响应。即使是鼠标也难以使用。

我可以使用此代码更改进程的进程优先级。

import psutil
p = psutil.Process(os.getpid())
p.nice = psutil.BELOW_NORMAL_PRIORITY_CLASS

但是,当我查看Windows任务管理器时,我发现只有主要的python.exe进程已经更改为低于正常优先级。

是否有一种降低池进程优先级的好方法?

3 个答案:

答案 0 :(得分:5)

您可以尝试设置进程'孩子的优先级。类似的东西:

import psutil

# spawn children and/or launch process pool here

parent = psutil.Process()
parent.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)
for child in parent.children():
    child.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)

答案 1 :(得分:1)

通过使用@GiampaoloRodolà的答案获得相同的结果,只需在生成子代之前设置父进程的优先级即可。

import psutil

parent = psutil.Process()
parent.nice(psutil.BELOW_NORMAL_PRIORITY_CLASS)
# the rest of your code

子进程将继承父进程的优先级。但是,如果要将父级设置为与子级不同的优先级,则需要@GiampaoloRodolà提供的代码。

答案 2 :(得分:0)

The Python documentation states that when a pool is created you can specify the number of processes. If you don't, it will default to os.cpu_count.因此,您将获得预期的行为,即使用了所有可用的逻辑核心。反过来,计算机变得无响应。

仅通过控制创建的进程数来做一些简单的事情可能会更好。经验法则是为交互处理保留2到4个逻辑核心。

此外,Python文档指出了“ This number [os.cpu_count()] is not equivalent to the number of CPUs the current process can use. The number of usable CPUs can be obtained with len(os.sched_getaffinity(0))

还有其他一些细节需要解决。我已尝试在此gist上捕获它们。您要做的就是为您的特定用例更改LOGICAL_CORES_RESERVED_FOR_INTERACTIVE_PROCESSING。