之前我曾尝试在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
答案 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