python中的multiprocessing真的是多进程运行?


问题

近日来在着手python的多进程训练数据的时候,出现了一个问题。在1台有着8核64G内存的机器,开启8个进程,结果是各进程各占用一个CPU且每个CPU的占用量都可达到100%。而为了加快速度,在一台15核24G内存的机器,开启10个进程,结果发现只有一个进程的占用了CPU,且CPU利用率达到100%,而看不到其它9个进程!WHY!!!


这里写图片描述

跑满CPU的机器


这里写图片描述

未跑满CPU的机器(注:有两个CPU的占用率为100%,是将程序两次运行,每次1个核)

发现

为了确定是否已经产生进程,我用ps aux|grep python查询,得到以下内容


这里写图片描述

可以看到,进程是创建了的。然而进程目前没有正式运行,在如此多CPU环境下,为什么新建的进程不会运行呢?

思考

并行运算的代码块中,是计算密集型的。因为计算的时间复杂度比较高,跑每一个例子会耗费几天的时间。因此不存在所谓活少人多的问题。

1.是否是进程优先级的问题
答案为否,因为个进程优先级一致,而每个进程所需的内存量和计算量基本一致,所需运行时间也接近的。

2.是否是代码层面的问题
答案为否,因为可以看到已经有台机器可以正常的按照意图来跑。

3.是否是机器的问题
答案有可能,那究竟是机器的什么问题呢?在一台21核和64G内存的机器上,同样也出现了类似的问题。这应该可以排除核数目和内存占比对此事的影响。

参考

1.https://segmentfault.com/q/1010000011117956
该题主描述了同样的问题。我觉得比较有意义的回答是这个

        multiprocessing.Pool 只是用来启动多个进程而不是在每个core上启动一个进程。换句话说Python解释器本身不会去在每个core或者processor去做负载均衡。这个是由操作系统决定的。如果你的工作特别的计算密集型的话,操作系统确实会分配更多的core,但这也不是Python或者代码所能控制的或指定的。
        multiprocessing.Pool(num)中的num可以很小也可以很大,比如I/O密集型的操作,这个值完全可以大于cpu的个数。
        硬件系统的资源分配是由操作系统决定的,如果你希望每个core都在工作,就需要更多的从操作系统出发了~

在后续的回答中给出了一个stackoverflow里面的此类问题介绍
2.https://stackoverflow.com/questions/21348746/python-multiprocessing-pool-doesnt-use-100-of-each-cpu

该位置解释中,有谈到进程间通信对该问题的影响,但我觉得没有意义。

有一个解释我到比较欣赏

        You’re asking wrong kind of question. multiprocessing.Process represents process as understood in your operating system. multiprocessing.Pool is just a simple way to run several processes to do your work. Python environment has nothing to do with balancing load on cores/processors.
        If you want to control how will processor time be given to processes, you should try tweaking your OS, not python interpreter.
        Of course, “heavier” computations will be recognised by system, and may look like they do just what you want to do, but in fact, you have almost no control on process handling.
    “Heavier” functions will just look heavier to your OS, and his usual reaction will be assigning more processor time to your processes, but that doesn’t mean you did what you wanted to – and that’s good, because that the whole point of languages with VM – you specify logic, and VM takes care of mapping this logic onto operating system.

大致意思是python解释器不会协调内核的计算。多进程中的进程是由操作系统来协调的,放在哪个CPU上跑,计算占比等等,要想控制这个,需要控制计算机。

实验

实验环境:4C8G
1.工作任务设置成计算密集型
四个任务被均分到四个核上,顺利运行

2.计算密集型+每个进程小内存消耗
四个任务被均分到四个核上,顺利运行

3.计算密集型+每个进程大内存消耗
计算机卡死(笑cry)

其实可以看到python多进程是正常的!!!Dame!!!

总结

目前linux选择的操作系统为centos,操作系统不是问题。应该是机器的问题,内核的问题。

——————————————分隔线————————————
有遇到同样问题的,欢迎讨论!

——————————————后记—————————————
现在在做实验,发现没有出现以前的情况了,每个核都会正常的处理。我在想之前可能是资源的问题了。内存资源不够,所以无法同时运行,只能等待!这只是猜想了。

转载自:https://blog.csdn.net/u013735511/article/details/80079373

You may also like...