2014-01-23 155 views
0

我有一个Tornado Web应用程序,它连接到本地主机上的TCP端口上的外部应用程序服务器。有时候,如果应用程序服务器响应缓慢,那么即使对Tornado服务器请求不与应用程序服务器通话的请求也会变慢,因为它们被其他请求阻止以完成。什么是正确的方式来处理这个问题?龙卷风请求超时

感谢, 阿希什

+0

你可以显示一些你通过TCP连接到你的应用服务器的代码吗?我担心你使用的是阻塞式连接,这可以解释为什么Tornado在等待应用服务器时无法响应其他请求。 –

回答

2

我最常做在这样的情况下是开始每个请求一个新主题(在该时间可能会超过500毫秒的处理程序)。为此,您需要使用@asynchronous修饰器将您的方法(例如get)声明为异步。 See here for more details.

一旦您将请求处理程序方法声明为异步,您必须自己调用self.finish()。否则龙卷风会在该方法执行后自行调用它。见async networking

下面的代码片段来启动一个线程,让它处理的请求......

class MainRequestHandler(tornado.web.RequestHandler): 
    @asynchronous 
     def post(self): 
     MainRequestThread(self).start() 

class MainRequestThread(threading.Thread): 
    def __init__(self, request = None, *args, **kwargs): 
     super(MainRequestThread, self).__init__(*args, **kwargs) 
     self.request = request 

    def run(self): 
     #Do some long processing here... 
     self.request.finish("Some cool message") # self.request has the self of RequestHandler here 

注意:避免使用对每个请求处理器相同的结构。创建线程也有开销。

+0

使用线程时要小心。特别是,在调用'request.finish'之前,您必须使用'IOLoop.add_callback'将控制权转移回事件循环的线程:http://www.tornadoweb.org/en/stable/web.html#thread-safety-笔记推荐的使用Tornado线程的方法是使用协程和concurrent.futures.ThreadPoolExecutor。 –

1

正如user2877889提到的,您希望使您的RequestHandlers处于异步状态,以确保其他请求不会因为长时间运行的请求而排队。但是与此同时,还需要注意的是,如果您现在正处于暂停状态,那么您可以在将其设置为非阻止或异步之后再获取它。

你想要做的是在发送请求时增加超时。无论您使用什么方式发送请求,都应该有一种方法来设置超时。在jQuery中,你可以像this