龙卷风请求超时

时间:2014-01-23 17:46:34

标签: python tornado

我有一个Tornado Web应用程序,它连接到localhost上TCP端口上的外部应用程序服务器。有时,如果应用服务器响应缓慢,那么即使对不与应用服务器通信的Tornado服务器的请求也会变慢,因为它们会被其他请求完成。处理这个问题的正确方法是什么?

谢谢, 阿希什

2 个答案:

答案 0 :(得分:2)

在这种情况下我通常做的是在每个请求上启动一个新线程(处理程序可能需要超过500毫秒)。为此,您需要使用@asynchronous装饰器将您的方法(例如get)声明为异步。 See here for more details.

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

以下是启动Thread并让它处理请求的代码片段...

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

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

答案 1 :(得分:1)

正如user2877889所提到的,您希望使RequestHandler异步,以确保其他请求因长时间运行请求而未排队。但与此同时,同样重要的是要注意,如果你现在正在暂停,你也可以在非阻塞或异步之后得到它。

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

那样执行此操作