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

问题描述 投票:0回答:1

在我的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方法结束后自动调用的。所以有没有办法让requestHandler继续“等待”,而我没有通过文件调用request.finish()

python tornado
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.