在我的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是否可以保持“等待”呢?
答案 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)