我使用multiprocessing.Pool()
来并行化一些繁重的Pandas处理,但发现它有点太成功了。我的CPU使用率达到100%,我的整台计算机变得非常无响应。即使是鼠标也难以使用。
我可以使用此代码更改进程的进程优先级。
import psutil
p = psutil.Process(os.getpid())
p.nice = psutil.BELOW_NORMAL_PRIORITY_CLASS
但是,当我查看Windows任务管理器时,我发现只有主要的python.exe进程已经更改为低于正常优先级。
是否有一种降低池进程优先级的好方法?
答案 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个逻辑核心。
还有其他一些细节需要解决。我已尝试在此gist上捕获它们。您要做的就是为您的特定用例更改LOGICAL_CORES_RESERVED_FOR_INTERACTIVE_PROCESSING。