多进程=多个进程运行?
我对多进程有点困惑。我已经编程三年了,主要用Python,但其实从来没有真正需要过并行处理(不仅仅是异步)。不过我知道,或者说我以为我知道,当使用Python的multiprocessing
模块来实现“真正的并行”时,会启动新的python.exe
进程!
比如像Cinema 4D这样的3D软件,会利用所有可用的CPU来渲染3D场景。但是我在任务管理器中并没有看到多个Cinema 4D.exe
进程。
- 我说的对吗?使用
multiprocessing
模块时,确实会启动多个Python进程吗? - 如果是这样,那为什么C++应用可以在没有多个进程的情况下使用所有CPU呢?
3 个回答
通常情况下,你会使用多个线程,而不是多个进程。使用线程有很多好处,最主要的好处是所有线程共享同一个进程的内存,这样你就不需要为不同进程之间的数据共享设置复杂的内存共享协议。
Python和C++都支持多线程,但正如其他地方提到的,Python代码不能在多个处理器上同时运行。不过,它在“半并行”操作中还是很有用的(我曾用Python线程读取一个文件,同时在声卡上播放,并且同时录制并保存另一个文件,同时还通过串口发出其他命令来控制正在测试的设备)。
Python的模块multiprocessing
确实是用来启动多个独立进程的,这有助于“打破Python解释器锁”。
一般来说,如果你希望代码与系统中其他任务完全独立,并且不需要在进程之间共享太多数据,那么使用独立进程会更有用。例如,计算非常大的质数就适合在独立进程中进行(我指的是那些有几十万位或更多位的质数)——这个进程可以独立运行几个小时,几乎不需要其他输入,只需要一个不变的小输入——“质数候选者”。
我说的对吗,使用多进程模块时会产生多个Python进程?
对的,没错。Python需要创建新的进程(也就是运行额外的解释器)来实现并行处理。这是因为GIL(全局解释器锁)只允许每个解释器运行一个执行线程。
那为什么C++应用可以不通过多个进程就能使用所有的CPU呢?
可能是因为Cinema4D没有类似GIL的东西——所以它可以同时执行多个线程。
在同一个程序中,可以通过运行多个线程来使用多个CPU。不过,Python的multiprocessing
模块并不是这样做的。
Python里有一个threading
模块。可惜的是,在CPython中,线程的效果没有你想象的那么好,因为它们都要争抢一个叫做“全局解释器锁”的东西。所以在Python中,线程的并行性远不如其他很多语言。如果你使用线程,就需要考虑你的代码中哪些操作是真正可以并行执行的。如果你使用进程,就不需要担心这个问题(不过你可能需要考虑其他事情,比如数据共享)。
我不知道其他版本的Python是否也有这个“全局解释器锁”的问题。但除非你是专门为Jython、IronPython等编写代码,否则CPython的限制都会影响你的程序……