作者Casval (卡斯巴尔)
看板Python
标题[问题] 新手请教multiprocessing
时间Sat May 25 13:15:14 2013
不好意思直接贴程式码..我想包一个父类别可以自动切割资料让子类别平行运算,
算完後再把结果加总。
但单程跟多程跑出来的结果不同,可能资料在多程中被乱写了..
请问怎麽设计才是正确的?
import multiprocessing
class Super:
def main(self):
pass
def result(self):
return []
def join(self, result=[]):
pass
def Run(self, param):
for i in range(param):
self.main()
return self.result()
def SingleRun(self):
result = []
for i in range(10):
result.append(self.Run(i))
self.join(result)
def MultiRun(self):
pool = multiprocessing.Pool(processes=4)
result = []
for i in range(10):
result.append(pool.apply_async(self.Run, (i,)))
pool.close()
pool.join()
result = [r.get() for r in result]
self.join(result)
class Child(Super):
def __init__(self):
self.total = 0
def main(self):
self.total += 1
def result(self):
return self.total
def join(self, result=[]):
total = 0
for r in result:
total += r
print('the result is', total)
c = Child()
if __name__ == '__main__':
c.SingleRun()
c.__init__()
c.MultiRun()
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.209.142.12
※ 编辑: Casval 来自: 210.209.142.12 (05/25 16:26)
1F:→ Casval:仔细看了一下,好像单程的结果才是错的.. orz 05/25 17:08
2F:→ Casval:SingleRun里的回圈没有reset导致後来的运算累加前次结果 05/25 17:16
3F:→ swpoker:有多执行吗 05/26 02:12
4F:→ Casval:有的,MultiRun()的结果才是对的 05/26 08:05
补上後来改的版本,运算结果为55
import multiprocessing
class Super:
def init(self):
pass
def main(self):
pass
def result(self):
return []
def join(self, result=[]):
pass
def Run(self, param):
for i in range(param):
self.main()
return self.result()
def SingleRun(self):
result = []
for i in range(1,11):
self.init()
result.append(self.Run(i))
self.join(result)
def MultiRun(self):
pool = multiprocessing.Pool(processes=4)
result = []
for i in range(1,11):
result.append(pool.apply_async(func=self.Run, args=(i,)))
pool.close()
pool.join()
result = [r.get() for r in result]
self.join(result)
class Child(Super):
def init(self):
self.total = 0
def main(self):
self.total += 1
def result(self):
return self.total
def join(self, result=[]):
total = 0
for r in result:
total += r
print('the result is', total)
c = Child()
if __name__ == '__main__':
c.init()
c.SingleRun()
c.init()
c.MultiRun()
※ 编辑: Casval 来自: 210.209.142.12 (05/26 08:07)
5F:→ Casval:我最早是在C#接触这种用法,不知谁抄谁的..但真的很好用.. 05/26 08:09
6F:→ Casval:既能有平行处理的好处,又比写Multi-Thread简单多了.. 05/26 08:10
7F:→ Casval:Python真是一种实用又不罗嗦的语言.. I like it~ ^^ 05/26 08:34
8F:→ Casval:实际运用,在MultiRun()里切割资料为参数,喂给Run()去跑。 05/26 08:45
9F:→ Casval:main()是运算逻辑,result()传回单程序计算结果,最後再由 05/26 08:47
10F:→ Casval:self.join()来结合统整所有的单程计算结果。 05/26 08:48
11F:→ Casval:这是要跑模拟用的框架,不然Run,main,result可以合并为一 05/26 21:03
12F:→ swpoker:用template做比较好吧~其实单一就是只有一个"multiRun" 05/28 11:52
13F:→ swpoker:有套用cloud的平行套件~可在多SERVER上跑应该更适合吧 05/28 11:53
14F:→ Casval:谢谢~我是新手,你说的东西我在找时间研究 ^^ 05/28 14:02
15F:→ Casval:不过目前暂时还没要玩web的部分,也没有多个server可以try 05/28 14:03
16F:→ swpoker:多SERVER用挂VM就可以玩拉~重点这才是正港的平行运算阿 05/29 09:01
17F:→ swpoker:在单一机器上跑还是有点不太平行阿~(误) 05/29 09:02
18F:→ Casval:可以麻烦您对template,cloud给些link吗? 05/29 09:18
19F:→ Casval:我不确定我google到的是否是您所说的东西.. 05/29 09:18
20F:→ swpoker:例如芹菜拉!可用来当作cluster 运算 05/30 14:11