我开始学习如何使用多处理,最好学习的是做一些试验,看看会发生什么。所以我做到了,但是在我的第一次尝试中,我得到了一些我不确定的东西,所以我将非常感谢您的评论或更正:
所以,我做了一个非常简单的程序,只需读取pytable并打印结果,具体取决于一个给定的参数:
from tables import *
import scipy as sc
def getP(pathToTable, p):
with openFile(pathToTable,'r') as f:
tab = f.getNode("/mainTab")
a = [row['value'] for row in tab.where("(page == p) & (ok == 1)")]
print (p, sc.mean(a), sc.std(a))
而且,为了测试它,我这样做:
>>> import multiprocessing
>>>pags = [1,2,3,4,5,6,7,8]
>>> te = 'C:\Desktop\testMultiProc.h5'
>>>import testMp as m
>>> for i in pags:
... p = multiprocessing.Process(target=m.getP, args=(te,i))
... p.start()
... p.join()
...
这是有效的,我得到的结果如下:
(1, 9.0953793794588282, 0.33533126564851207)
(2, 9.0871612678994946, 0.33453983570210977)
(3, 9.0466206717415556, 0.32227094723414906)
(4, 9.1115445293825204, 0.32247317223440275)
(5, 9.1731876730458826, 0.33230456228097616)
(6, 8.9801903625732713, 0.32238759095899067)
(7, 9.0102797573336719, 0.34441213144617178)
(8, 8.8340961470191885, 0.32342748738790894)
所以这是我的问题:
如果我没有错,这是同时发生的,那么,为什么我要按顺序获得输出?我的意思是,让我们说对于p = 3,该过程结束第一个,因为表中的值很少,p = 3,那么为什么我没有得到(3, 9.0466206717415556, 0.32227094723414906)
作为第一个输出? ?
这让我觉得我做错了或者我不明白这里发生了什么。
我选择pags = [1,2,3,4,5,6,7,8]
时考虑到了一个想法....我这样做是因为,首先我做了:
>>> multiprocessing.cpu_count()
8
所以我的想法是获利8核。
答案 0 :(得分:2)
不,这不会同时发生,因为您正在调用join
。
join
将阻止,直到该过程完成。
有效:
您需要在该循环中删除join
调用。如果要等待所有子进程完成,请存储调用multiprocessing.Process
的结果并在单独的循环中连接这些值,如(未经测试):
processes = []
for i in pags:
p = multiprocessing.Process(target=m.getP, args=(te,i))
p.start()
processes += [p]
for p in processes:
p.join()