思考
并行运算的代码块中,是计算密集型的。因为计算的时间复杂度比较高,跑每一个例子会耗费几天的时间。因此不存在所谓活少人多的问题。
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
原文地址:https://www.cnblogs.com/Allen-rg/p/10121701.html