2016-07-26 75 views
0

我的影片所使用的提交任務,一些芹菜工人與RabbitMQ的後端提交長時間運行(〜分)計算龍捲風服務器。所提交的任務產生龍捲風協程一WebSocketHandler內:龍捲風網絡套接字和長時間運行的任務,芹菜

class MainWSHandler(WebSocketHandler): 
    def open(self): 
     logging.info("Connection opened.") 

    def on_close(self): 
     logging.info("Connection closed.") 

    def on_message(self, message): 
     result = self.submit_task(message) 

     self.write_message("Calculation has been submitted") 

    @gen.coroutine 
    def submit_task(self, params): 
     result = yield gen.Task(long_calculation.apply_async, args=[params]) 

     self.write_message("Completed calculation") 

     return result 

這種運作良好,如果用戶從來沒有離開頁面與當前打開的網頁插座。如果他們這樣做,並且網絡套接字關閉,則返回的消息self.write_message("Completed calculation")將失敗,並顯示WebSocketClosedError。在用戶不打算返回頁面一段時間的情況下(即,直到計算完成後),這是很好的。

然而,在用戶提交的計算,離開頁面,然後返回計算完成之前,同樣引發錯誤,因爲網絡已經關閉了套接字和一個新打開的情況下。這可以防止計算完成消息傳播到前端。

我的問題是:是否有可能重新連接到同一個網絡插座?或者,或者,我怎樣才能確保一旦計算完成後返回的消息使其返回到用戶的當前頁面?

回答

0

好像我可能偷步假設有這一問題的結構性解決方案在這場曠日持久的任務上帶有一個的Web插槽系統所固有的。

這足以當前打開的web套接字存儲在一個類屬性

class MainWSHandler(WebSocketHandler): 
    self.clients = {} 

def open(self): 
    logging.info("Connection opened.") 
    self.clients[self.current_user] = self 

和處理來自任務的響應,通過使用存儲的網絡插座

@gen.coroutine 
def submit_task(self, params): 
    result = yield gen.Task(long_calculation.apply_async, args=[params]) 

    # Retrieve current web socket 
    ws = self.clients[self.current_user] 
    ws.write_message("Completed calculation") 

    return result 

有可能會更有效方式(或某種慣用方法),但我現在對此解決方案感到滿意。