使用Tornado,我发出一个GET请求,它会花费很长时间,因为它会向另一个Web服务发出许多请求并处理数据,可能需要数分钟才能完全完成。我不希望它阻塞整个Web服务器响应其他请求,但现在它确实如此。
据我所知,Tornado是单线程的,并且按顺序执行每个请求,即使它异步处理它们(我还有点困惑)。长过程中有一些部分可以作为暂停点,以允许服务器处理其他请求(可能是解决方案之一?)。我在Heroku上使用单个worker运行它,因此不确定如何将其转换为生成新线程或多进程,因为我在Python中没有经验。
这就是我正在尝试做的:客户端发出get调用以启动过程,然后我每5秒循环一次另一个get调用以检查状态并使用新信息更新页面(长轮询也可以工作,但遇到相同的问题)。问题在于开始长时间进程会阻止所有新的get请求(或新的长轮询会话)直到完成。
有没有一种简单的方法来启动这个长get调用并且不让它在该过程中阻塞整个Web服务器?在代码中是否有任何东西可以放置以表示“暂停,继续处理挂起的请求,然后再继续”?
我需要在ProcessHandler上初始化一个get请求。然后,当ProcessHandler运行时,我仍然需要能够查询StatusHandler。
示例:
据我所知,Tornado是单线程的,并且按顺序执行每个请求,即使它异步处理它们(我还有点困惑)。长过程中有一些部分可以作为暂停点,以允许服务器处理其他请求(可能是解决方案之一?)。我在Heroku上使用单个worker运行它,因此不确定如何将其转换为生成新线程或多进程,因为我在Python中没有经验。
这就是我正在尝试做的:客户端发出get调用以启动过程,然后我每5秒循环一次另一个get调用以检查状态并使用新信息更新页面(长轮询也可以工作,但遇到相同的问题)。问题在于开始长时间进程会阻止所有新的get请求(或新的长轮询会话)直到完成。
有没有一种简单的方法来启动这个长get调用并且不让它在该过程中阻塞整个Web服务器?在代码中是否有任何东西可以放置以表示“暂停,继续处理挂起的请求,然后再继续”?
我需要在ProcessHandler上初始化一个get请求。然后,当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()