如何在Python / Tornado中等待request.finish()的调用

时间:2019-04-24 11:57:58

标签: python tornado

在我的python文件中,我有两个处理程序类:MainHandler(tornado.web.RequestHandler)和WebSocketHandler(tornado.web.WebSocketHandler)。在MainHandler类中,我在get方法中执行以下代码:

class MainHandler(tornado.web.RequestHandler):
   #some code
   def get(self):
      #some code
      mainHandler_dict[chan] = self
      await self.finish() #line of code that would do the waiting somehow

因此,我将请求存储在全局字典中,以便可以在WebSocketHandler类的request.write()方法中调用request.finish()on_message

class WebSocketHandler(tornado.websocket.WebSocketHandler):
   def on_message(self, message):
      #some code 
      request.write(body)
      request.finish()

我从全局词典中获取了“ request”变量,并尝试调用write(),但是发生以下错误:RuntimeError: Cannot write() after finish()

我认为finish()是在MainHandler类中的get方法结束后被自动调用的。 那么,在我不通过文件调用某个地方的request.finish()时,requestHandler是否可以保持“等待”呢?

1 个答案:

答案 0 :(得分:0)

您可能应该以其他方式处理此问题;不要存储“请求”,尝试以某种方式使其保持活动状态,并从其他位置写入该请求,而应让请求处理程序等待所需的值变为可用。例如:

class MainHandler(RequestHandler):
    async def get(self):
        value = await magic()
        self.write(value)

现在,如何处理“ magic”部分取决于该值的来源和可支配的内容,但让我们用一个简单的Future进行说明:

async def get(self):
    futures[chan] = asyncio.Future()
    value = await futures[chan]
    self.write(value)

以及其他地方:

futures[chan].set_result(42)