gpt4 book ai didi

python - 试图理解多处理

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:47 26 4
gpt4 key购买 nike

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

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

最佳答案

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

join 将阻塞,直到进程完成。

有效:

  1. 您启动一个单独的流程来处理第一个项目
  2. 您等待该过程完成
  3. 您启动一个单独的流程来处理第二个项目
  4. 您等待该过程完成
  5. ...等等

您需要将 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()

关于python - 试图理解多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24379919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com