python 多进程,实际上都没有运行,sleep

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

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

时间: 2024-10-14 14:40:30

python 多进程,实际上都没有运行,sleep的相关文章

Python多进程使用

[Python之旅]第六篇(六):Python多进程使用 香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要:   关于进程与线程的对比,下面的解释非常好的说明了这两者的区别:     这里主要说明关于Python多进程的下面几点: 1 2 3 4 5 6 7 1.多进程的使用方法 2.进程间的通信之multiprocessing.Manager()使用 3.Python进程池 ... 关于进程与线程的对比,下面的解释非常好的说明了这两者

【Python之旅】第六篇(六):Python多进程使用

关于进程与线程的对比,下面的解释非常好的说明了这两者的区别: 这里主要说明关于Python多进程的下面几点: 1.多进程的使用方法 2.进程间的通信 3.Python进程池 (1)比较简单的例子 (2)多个进程多次并发的情况 (3)验证apply.async方法是非阻塞的 (4)验证apply.async中的get()方法是阻塞的 1.多进程的使用方法 直接给出下面程序代码及注释: from multiprocessing import Process    #从多进程模块中导入Process

Python多进程池 multiprocessing Pool

1. 背景 由于需要写python程序, 定时.大量发送htttp请求,并对结果进行处理. 参考其他代码有进程池,记录一下. 2. 多进程 vs 多线程 c++程序中,单个模块通常是单进程,会启动几十.上百个线程,充分发挥机器性能.(目前c++11有了std::thread编程多线程很方便,可以参考我之前的博客) shell脚本中,都是多进程后台执行.({ ...} &, 可以参考我之前的博客,实现shell并发处理任务) python脚本有多线程和多进程.由于python全局解锁锁的GIL的存

Python多进程(1)——subprocess与Popen()

Python多进程方面涉及的模块主要包括: subprocess:可以在当前程序中执行其他程序或命令: mmap:提供一种基于内存的进程间通信机制: multiprocessing:提供支持多处理器技术的多进程编程接口,并且接口的设计最大程度地保持了和threading模块的一致,便于理解和使用. 本文主要介绍 subprocess 模块及其提供的 Popen 类,以及如何使用该构造器在一个进程中创建新的子进程.此外,还会简要介绍 subprocess 模块提供的其他方法与属性,这些功能上虽然没

最简单方法远程调试Python多进程子程序

Python 2.6新增的multiprocessing,即多进程,给子进程代码调试有点困难,比如python自带的pdb如果直接在子进程代码里面启动会抛出一堆异常,原因是子进程的stdin/out/err等文件都已关闭,pdb无法调用.据闻winpdb.Wing IDE的调试器能够支持这样的远程调试,但似乎过于重量级(好吧前者比后者要轻多了,但一样要wxPython的环境,再说pdb的灵活可靠它们难以比拟). 其实只需稍作改动即可用pdb继续调试子进程的代码,思路来自这个博客:子进程的stdi

【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码

转自:http://www.crifan.com/python_already_got_correct_encoding_string_but_seems_print_messy_code/ [背景] Python中的字符编码,其实的确有点复杂. 再加上,不同的开发环境和工具中,显示的逻辑和效果又不太相同,尤其是,中文的,初级用户,最常遇到的: (1)在Python自带的IDE:IDLE中折腾中文字符,结果看到的差不多都是乱码类的东西,比如:’\xd6\xd0\xce\xc4′ (2)将一个中文

第十五章 Python多进程与多线程

15.1 multiprocessing multiprocessing是多进程模块,多进程提供了任务并发性,能充分利用多核处理器.避免了GIL(全局解释锁)对资源的影响. 有以下常用类: 类 描述 Process(group=None, target=None, name=None, args=(), kwargs={}) 派生一个进程对象,然后调用start()方法启动 Pool(processes=None, initializer=None, initargs=()) 返回一个进程池对象

Python多进程和多线程是鸡肋嘛?【转】

GIL是什么 Python的代码执行由 Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到在解释器的主循环中,同时只有一个线程在运行.即每个CPU在任意时刻只有一个线程在解释器中运行.对 Python虚拟机访问的控制由全局解释锁GIL控制,正是这个锁来控制同一时刻只有一个线程能够运行.——在单核CPU下的多线程其实都只是并发,不是并行 . 并发与并行区别 并发:两个或多个事件在同一时间间隔发生,或者说交替做不同事件的能力,或者说不同的代码块交替执行.

Python多进程multiprocessing(二)

紧接上文 在上文Python多进程multiprocessing(一)中我们介绍了多进程multiprocessing的部分基础操作,在本文中,我们将继续介绍关于多进程的一些知识,比如进程池Pool这个有用的东东.马上开始吧! 使用实例 实例1 import multiprocessing as mp def job(x): return x*x def multicore(): pool = mp.Pool(processes=2) res = pool.map(job,range(10))