使用Tornado时,我有一个Get请求需要很长时间,因为它向另一个Web服务发出许多请求并处理数据,可能需要几分钟才能完全完成。我不希望这阻止整个Web服务器响应其它请求,它目前所做的。龙卷风阻止异步请求
据我所知,Tornado是单线程的并且同步执行每个请求,即使它异步处理它们(仍然困惑在那个位上)。有很长一段时间的流程可能会暂停点以允许服务器处理其他请求(可能的解决方案?)。我在Heroku上使用单个工作人员来运行它,所以不知道如何转化为产生新的线程或多处理,我没有使用python的经验。
下面是我正在做的事情:客户端使get调用来启动进程,然后我每隔5秒循环一次get call来检查状态并用新信息更新页面(长轮询会也工作,但遇到同样的问题)。问题在于,开始漫长的过程会阻止所有新的获取请求(或新的长轮询会话),直到完成。
有没有简单的方法来启动这个长时间的调用,并没有阻止整个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模块? http://www.tornadoweb.org/documentation/gen.html –
你记得把它注释为一个异步调用:在你的GET方法上加上@asynchronous –
andyboot是的,我在我的GET方法上有@asynchronous – JeffG