【发布时间】:2015-12-15 00:17:01
【问题描述】:
在我使用的 linux 系统上,调度程序并不是很慷慨地给从 python 的多处理模块产生的子进程提供 cpu 时间。在 4 核机器上使用 4 个子进程时,根据ps,我得到大约 22% 的 CPU。但是,如果子进程是 shell 的子进程,而不是 python 程序,它会上升到接近 100% 的 CPU。但是与手动拆分我的数据并为每个拆分运行单独的 python 程序相比,多处理是一个更好的界面,并且最好同时获得两全其美(代码组织和高 CPU 利用率)。我尝试将进程的 niceness 设置为 -20,但这没有帮助。
我想知道使用某些选项重新编译 linux 内核是否会帮助调度程序为 python 多处理工作人员提供更多的 CPU 时间。也许有相关的配置选项?
我使用的确切版本是:
$ uname -a
Linux <hostname> 3.19.0-39-generic #44~14.04.1-Ubuntu SMP Wed Dec 2 10:00:35 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
如果这可能与我使用多处理的方式有关,它的形式是:
with Pool(4) as p:
p.map(function,data)
更新:
这不是一个可重现的问题。这里报告的结果是几天前的结果,我再次运行测试,多处理过程与我希望的一样快。也许这个问题应该被删除,误导人们对multiprocessing的预期表现不好。
【问题讨论】:
-
你确定是内核的错吗?这个问题似乎与 Python 无法真正并行运行作业更相关。
-
多进程工作者是他们自己的进程,有自己的 PID。我的理解是,这些过程彼此不同,就像它们来自我的网络浏览器一样。
-
您可能 [容易] 使您的内存总线饱和(即)您受内存限制,而不是计算限制。也许,你可以估计或基准来确认。查看 /sys/devices/system/cpu/cpu*/cpufreq 并设置为“性能”
-
我认为您应该编写一个简单的基准测试,其中每个任务都完全独立于其他任务。然后比较使用
multiprocessing模块运行它们与启动四个 Python 脚本实例。 -
这就是我在帖子中所做的和描述的:“但是,如果子进程是 shell 的子进程,而不是 python 程序,它会上升到接近 100% CPU ...手动拆分我的数据,并为每个拆分运行单独的 python 程序"。
标签: python subprocess python-multiprocessing