以下代碼對我來說似乎無法正常工作。它需要網絡上的另一臺計算機上啓動ppserver,例如用下面的命令:令人費解的並行Python問題 - TRANSPORT_SOCKET_TIMEOUT
ppserver.py -r -a -w 4
一旦服務器啓動後,我的機器上運行此代碼:
import pp
import time
job_server = pp.Server(ppservers = ("*",))
job_server.set_ncpus(0)
def addOneBillion(x):
r = x
for i in xrange(10**9):
r+=1
f = open('/home/tomb/statusfile.txt', 'a')
f.write('finished at '+time.asctime()+' for job with input '+str(x)+'\n')
return r
jobs = []
jobs.append(job_server.submit(addOneBillion, (1,),(), ("time",)))
jobs.append(job_server.submit(addOneBillion, (2,),(), ("time",)))
jobs.append(job_server.submit(addOneBillion, (3,),(), ("time",)))
for job in jobs:
print job()
print 'done'
奇怪之處: 看着/home/tomb/statusfile.txt,我可以看到它被寫入了好幾次,好像該函數正在運行幾次。我觀察到這種情況持續了一個多小時,從未見過job()
的回報。
Odder: 如果我將testfunc定義中的迭代次數更改爲10 ** 8,則該函數只運行一次,並返回預期的結果!
看起來像某種競爭條件?只使用本地核心工作正常。這是與pp v 1.6.0和1.5.7。
更新:約775,000,000個:我得到不一致的結果:兩個工作重複一次,第一次完成。
本週後更新:我編寫了自己的並行處理模塊來解決這個問題,並且將來會避免並行python,除非有人知道 - 我會繞過去看看它(實際上潛入源代碼中)。
幾個月後更新:沒有剩餘的硬感,並行Python。我計劃儘快遷移我的應用程序。標題編輯以反映解決方案。
@Thomas:我們是盲目的,沒有關於作業和其他執行調試細節的附加信息。爲什麼不嘗試pp中的一個例子,看看它們是否可以爲你工作。這將是一個好的開始,然後採用簡單的功能並使用您的代碼來提交作業。看看它是否有任何區別。這樣你可以縮小問題的範圍。 – pyfunc 2010-11-05 00:34:36
@Thomas:示例鏈接:http://www.parallelpython.com/content/view/17/31/ – pyfunc 2010-11-05 00:36:43
應該被稱爲「令人費解的並行Python問題」。 – 2010-11-05 16:35:32