使用Python生成多个进程

时间:2017-10-15 13:39:15

标签: python multiprocessing python-multiprocessing

之前我曾尝试在python中使用线程模块来创建多个线程。然后我了解了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

2 个答案:

答案 0 :(得分:2)

Process类需要callable作为其目标。

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

只需更改以下内容:

mp.Process(target=pri())

使用:

mp.Process(target=pri)

答案 1 :(得分:0)

由于子进程在不同的进程上运行,因此您将看不到它们的print语句。它们也不共享相同的内存空间。你将pri()传递给target,它需要pri。你需要传递一个可调用对象,而不是执行它。

您看到的照片是主线程执行的一部分。因为您传递pri(),所以代码实际上已执行。您需要更改代码,以便pri函数返回值,而不是打印它。

然后你需要实现一个queue,你的所有线程到它,当它们完成后,你的主线程就会读取队列。

multiprocessing模块的一个很好的功能是Pool对象。它允许您创建一个线程池,然后只使用它。它更方便。

我已经尝试了你的代码,事情是命令执行得太快,所以操作系统重用了PID。如果在pri函数中添加time.sleep(1),它将按预期工作。

  

这仅适用于Windows。以下示例在Windows平台上进行。在类似Unix的机器上,你不需要睡眠。

更方便的解决方案是这样的:

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