Re: [問題] python multiProcess效能很差?

作者: ntuleo (里歐)   2015-04-29 09:41:58
經過大家的提醒,我修改了我的代碼如下
if __name__ == "__main__":
content = input_file(target).split("\n")
content = manager.list(content)
for files in source:
obj_grab.append((LogCatcher(files), content))
pool = Pool()
pool.map(transferConcat, obj_grab)
pool.close()
pool.join()
def concatMessage(logCatcher, content):
for key in logCatcher.dic_map:
regex = re.compile(key)
for j in range(len(content)):
for m in re.finditer(regex, content[j]):
content[j] += logCatcher.index + obj_grab.dic_map[key]
def transferConcat(args):
return concatMessage(*args)
結果變82秒....
人生已經如此的艱難...
請問這裡哪一步又做錯了呢?
作者: ccwang002 (亮)   2015-04-29 12:48:00
你可能要說明一下你的程式做了什麼,或者給個 sample因為我不知道怎麼把你原本的 code 跟新版的對應
作者: CaptainH (Cannon)   2015-04-29 12:59:00
這code真是可怕…就算能動也一堆bug所有的process都存取同一份 content,又在迴圈裡更改迭代對象,太可怕了
作者: ntuleo (里歐)   2015-04-29 19:31:00
很可怕嗎XD multiprocess不都是這樣嗎?
作者: beatitude (...)   2015-04-29 19:42:00
都已經在用multiprocessing了還不懂得避開副作用 高手
作者: ntuleo (里歐)   2015-04-29 19:45:00
怎麼說呢? 可以指點我一下嗎? 我不是高手...
作者: LiloHuang (十年一刻)   2015-04-29 20:01:00
你不應該嘗試去修改輸入的資料,除非是 Shared memory無論是 multiprocess 或者 multithread 的實作裡你得想辦法讓每個 process (或 thread) 各自跑各自的等到跑完之後,再將資料做合併,才是一個比較好的方式當然這個方法未必適用於你要解決的問題,只是一旦使用Shared memory 之後,你就得進行 Synchronization 保護過度的 Synchronization 會造成 CPUs 浪費時間在競爭鎖舉個例子來說,假設輸入是 a-z 的字串,平行的轉成大寫from multiprocessing.pool import ThreadPoolpool = ThreadPool()print reduce(lambda x,y: x+y, pool.map(lambda x:x.upper(), map(chr, range(97, 123))))上述的範例內,輸入是一個 list (分別為 a-z 字元)輸出也是一個 list (已經轉成 A-Z),再用 reduce 合併這就是一個概念,想要平行處理就要讓 task 真正的平行然而上述的例子,由於並不是 CPU intensive 的計算開了 thread (或 process) 反而會比沒開來的慢我無法回答你的程式為何會如此慢,建議貼 GitHub Gist如果你能附上完整的程式碼,以及可重現問題的輸入資料相信其他板友會比較有機會能夠幫你找到問題的癥結點pool.map(...) 的概念是有輸入跟輸出,要特別留意這點另外實務上,請盡量避免使用 ThreadPool,改用 Pool我只是為求簡便示範給你看,以免實際程式被 GIL 給拖慢

Links booklink

Contact Us: admin [ a t ] ucptt.com