试图理解多处理

时间:2014-06-24 06:39:36

标签: python multiprocessing

我开始学习如何使用多处理,最好学习的是做一些试验,看看会发生什么。所以我做到了,但是在我的第一次尝试中,我得到了一些我不确定的东西,所以我将非常感谢您的评论或更正:

所以,我做了一个非常简单的程序,只需读取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核。

1 个答案:

答案 0 :(得分:2)

不,这不会同时发生,因为您正在调用join

join将阻止,直到该过程完成。

有效:

  1. 您开始一个单独的流程来处理第一项
  2. 您等待该过程完成
  3. 您开始一个单独的流程来处理第二项
  4. 您等待该过程完成
  5. ......等等
  6. 您需要在该循环中删除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()