【发布时间】:2012-10-14 15:12:02
【问题描述】:
使用 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()
【问题讨论】:
-
你试过tornado.gen模块吗? tornadoweb.org/documentation/gen.html
-
您是否记得将其注释为异步调用:在您的 GET 方法上添加:@asynchronous
-
andyboot 是的,我的 GET 方法上有 @asynchronous
-
唐,我试图将函数包装在 get.task 中,但它仍然阻止了其他 get 请求。我更新了我的帖子,以便更好地了解我正在尝试做的事情。
标签: python tornado long-polling