使用 Python 生成多个进程

Spawning multiple processes with Python

早些时候我尝试使用 python 中的 threading 模块来创建多线程。然后我了解了 GIL 以及它如何不允许在一台机器上利用多个 CPU 核心。所以现在我正在尝试进行多处理(我并不严格需要单独的线程)。

这是我编写的示例代码,用于查看是否正在创建不同的进程。但是从下面的输出中可以看出,我每次都得到相同的进程 ID。所以没有创建多个进程。我错过了什么?

import multiprocessing as mp
import os

def pri():
    print(os.getpid())

if __name__=='__main__':

    # Checking number of CPU cores
    print(mp.cpu_count())

    processes=[mp.Process(target=pri()) for x in range(1,4)]

    for p in processes:
        p.start()

    for p in processes:
        p.join()

输出:

4
12554
12554
12554

Process class 需要一个可调用对象作为其目标。

而不是 运行 单独进程中的函数,您调用它并将其结果(在本例中为 None)传递给 Process class。

只需更改以下内容:

mp.Process(target=pri())

与:

mp.Process(target=pri)

由于子进程在不同的进程上运行,您将看不到它们的打印语句。他们也不共享相同的内存 space。您 将 pri() 传递给目标,它需要是 pri。 您需要传递一个 可调用对象 ,而不是执行它。

您看到的指纹是 主线程 执行的一部分。因为你传了pri(),代码才真正执行。您需要更改您的代码,以便 pri 函数 returns 值,而不是打印它。

然后你需要实现一个 queue,你的所有线程 都向它写入 ,当它们完成后,你的 主线程 读取队列。

multiprocessing 模块的一个很好的特性是 Pool 对象。它允许您创建一个线程池,然后直接使用它。比较方便。

我试过你的代码,问题是命令执行得太快,所以OS重用了PID。如果您在 pri 函数中添加一个 time.sleep(1),它将按您预期的那样工作。

That is True only for Windows. The example below is made on Windows platform. On Unix like machines, you won't need the sleep.

比较方便的方案是这样的:

from multiprocessing import Pool
from time import sleep
import os

def pri(x):
    sleep(1)
    return os.getpid()

def use_procs():
    p_pool = Pool(4)
    p_results = p_pool.map(pri, [_ for _ in range(1,4)])
    p_pool.close()
    p_pool.join()
    return p_results

if __name__ == '__main__':
    res = use_procs()
    for r in res:
        print r

不睡觉:

==================== RESTART: C:/Python27/tests/test2.py ====================
6576
6576
6576
>>> 

同眠:

==================== RESTART: C:/Python27/tests/test2.py ====================
10396
10944
9000