2016-07-26 80 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 

有可能会更有效方式(或某种惯用方法),但我现在对此解决方案感到满意。