2015-10-20 56 views
0

我想用芹菜來平行不同參數的功能評估。 這就是爲什麼我想實現一個僞代碼,它假定有裝飾的一個名爲evaluate功能與@app.task芹菜設置和拆卸任務

# 0. Setup cluster, celery or whatever parallelisation backend 
pass 


# 1. Prepare each node to simulate, this means sending some files 
for node in mycluster: 
    #send files to node 
    pass 

# 2. Evaluation phase 
gen = Generator() # A Generator object creates parameter vectors that need to be evaluated 
while not gen.finished(): 
    par_list = gen.generate() 
    asyncs = [] 
    for p in par_list: 
     asyncs.append(evaluate.delay(p)) 


    results = [-1 for _ in par_list] 

    for i, pending in enumerate(asyncs): 
      if not pending.ready(): 
       pending.wait() 
      if pending.successful(): 
       results[i] = pending.get() 
      else: 
       pass # manage error 
    # send results to generator so that it generates a new set of parameters later 
    gen.tell(results) 


# 3. Teardown phase 
for node in mycluster: 
    #tell node to delete files 
    pass 

這種方法的問題是,如果我的主要應用程序正在運行,它已經過了設置階段,那麼當新節點連接時,肯定不會通過設置階段。同樣,如果節點斷開連接,則拆卸階段將不會執行。

一對夫婦的解決方案浮現在腦海中:

  • 而不是使用一個設置階段,鏈,使兩種功能,每個節點不設置|評估|拆分「2.評估階段」循環的每個迭代。這裏的問題是通過消息隊列發送文件是我想盡可能避免的。
  • 配置工作人員進行設置和拆卸任務,以便他們在連接時自動準備好。我嘗試使用bootsteps.StartStopStep,但我不確定這是否正確。
  • 安裝分佈式文件系統,這樣就沒有必要前後評估

的具體問題,這是後準備和刪除文件,什麼是這些類型的任務的建議的方法?我相信這不是一個複雜的用例,也許你可以提供一些指導我應該如何處理這個問題。

回答

0

我不確定這是否是工人問題 - 請記住,您可能在節點上有大量工作人員。這聽起來更像是一個節點初始化問題。爲什麼沒有一個工作(一個系統任務,一個初始化腳本,不管)在芹菜工人之前運行並且複製文件。同樣,反之亦然,用於拆除。