→ Casval:仔細看了一下,好像單程的結果才是錯的.. orz 05/25 17:08
→ Casval:SingleRun裡的迴圈沒有reset導致後來的運算累加前次結果 05/25 17:16
→ swpoker:有多執行嗎 05/26 02:12
→ 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)
→ Casval:我最早是在C#接觸這種用法,不知誰抄誰的..但真的很好用.. 05/26 08:09
→ Casval:既能有平行處理的好處,又比寫Multi-Thread簡單多了.. 05/26 08:10
→ Casval:Python真是一種實用又不囉嗦的語言.. I like it~ ^^ 05/26 08:34
→ Casval:實際運用,在MultiRun()裡切割資料為參數,餵給Run()去跑。 05/26 08:45
→ Casval:main()是運算邏輯,result()傳回單程序計算結果,最後再由 05/26 08:47
→ Casval:self.join()來結合統整所有的單程計算結果。 05/26 08:48
→ Casval:這是要跑模擬用的框架,不然Run,main,result可以合併為一 05/26 21:03
→ swpoker:用template做比較好吧~其實單一就是只有一個"multiRun" 05/28 11:52
→ swpoker:有套用cloud的平行套件~可在多SERVER上跑應該更適合吧 05/28 11:53
→ Casval:謝謝~我是新手,你說的東西我在找時間研究 ^^ 05/28 14:02
→ Casval:不過目前暫時還沒要玩web的部分,也沒有多個server可以try 05/28 14:03
→ swpoker:多SERVER用掛VM就可以玩拉~重點這才是正港的平行運算阿 05/29 09:01
→ swpoker:在單一機器上跑還是有點不太平行阿~(誤) 05/29 09:02
→ Casval:可以麻煩您對template,cloud給些link嗎? 05/29 09:18
→ Casval:我不確定我google到的是否是您所說的東西.. 05/29 09:18
→ swpoker:例如芹菜拉!可用來當作cluster 運算 05/30 14:11