使用 Tornado,我有一个 Get 请求需要很长时间,因为它向另一个 Web 服务发出许多请求并处理数据,可能需要几分钟才能完全完成。我不希望这会阻止整个 Web 服务器响应它当前所做的其他请求。
据我了解,Tornado 是单线程的,并且同步执行每个请求,即使它异步处理它们(仍然对此感到困惑)。漫长过程的某些部分可能是暂停点,以允许服务器处理其他请求(可能的解决方案?)。我用一个工人在 Heroku 上运行它,所以不确定这如何转化为产生一个新线程或多处理,我没有使用 python 的经验。
这是我正在尝试做的事情:客户端发出 get 调用以启动进程,然后我每 5 秒循环一次 get 调用以检查状态并使用新信息更新页面(长轮询也可以工作,但正在运行进入同一个问题)。问题是启动长进程会阻塞所有新的获取请求(或新的长轮询会话),直到它完成。
有没有一种简单的方法来启动这个漫长的 get 调用,而不是让它在这个过程中阻塞整个 Web 服务器?有什么我可以在代码中说的......“暂停,处理待处理的请求然后继续”?
我需要在 ProcessHandler 上发起一个获取请求。然后我需要在 ProcessHandler 运行时继续能够查询 StatusHandler。
例子:
class StatusHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.render("status.html")
class ProcessHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.updateStatus("0")
result1 = self.function1()
self.updateStatus("1")
result2 = self.function2(result1)
self.updateStatus("2")
result3 = self.function3(result2)
self.updateStatus("3")
self.finish()