2010-11-04 86 views
2

以下代碼對我來說似乎無法正常工作。它需要網絡上的另一臺計算機上啓動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。我計劃儘快遷移我的應用程序。標題編輯以反映解決方案。

+0

@Thomas:我們是盲目的,沒有關於作業和其他執行調試細節的附加信息。爲什麼不嘗試pp中的一個例子,看看它們是否可以爲你工作。這將是一個好的開始,然後採用簡單的功能並使用您的代碼來提交作業。看看它是否有任何區別。這樣你可以縮小問題的範圍。 – pyfunc 2010-11-05 00:34:36

+0

@Thomas:示例鏈接:http://www.parallelpython.com/content/view/17/31/ – pyfunc 2010-11-05 00:36:43

+3

應該被稱爲「令人費解的並行Python問題」。 – 2010-11-05 16:35:32

回答

2

回答Bagira並行的Python論壇:

多久每 作業的計算時間?看看變量 TRANSPORT_SOCKET_TIMEOUT /usr/local/lib/python2.6/dist-packages/pptransport.py。

也許你的工作需要比上面變量中的 時間更長的時間。增加 它的價值並嘗試。

原來這就是問題所在。在我的應用程序中,我將PP用作可能需要幾分鐘的作業的批處理調度程序,所以我需要調整它。 (默認爲30s)

1

這可能是因爲某些節點落後,該庫允許重複,因此將會有剩餘任務的長尾完成。通過複製任務,它可以繞過慢速節點,並且只需要首先完成的結果。您可以通過爲每個任務添加一個唯一的ID來解決此問題,並且只接受每個任務返回的第一個ID。

+0

嗯,我沒有觀察到或讀過關於這種行爲的平行python的一部分,但這是一種可能性。然而就我而言,這些工作似乎是在同一臺計算機上反覆執行 - 我猜如果它沒有正確返回,那麼服務器發現客戶端不忙,因此再次分配了該工作。 – Thomas 2010-11-18 03:01:41