我有一个Tornado Web应用程序,它连接到localhost上TCP端口上的外部应用程序服务器。有时,如果应用服务器响应缓慢,那么即使对不与应用服务器通信的Tornado服务器的请求也会变慢,因为它们会被其他请求完成。处理这个问题的正确方法是什么?
谢谢, 阿希什
答案 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
那样执行此操作