tornado接口阻塞导致主线程阻塞
tornado推荐是多进程+协程的方式运行,ioloop.current().start(),单个接口阻塞,会导致整个服务阻塞,所以一般接口逻辑中要使用非阻塞的方法。
比如time.sleep(5)应该更换为yield gen.sleep(5),这样就可以将资源让给其他接口处理,该接口仍然会阻塞,等同于time.sleep(5)
tornado接口阻塞导致主线程阻塞,将启动进程设为与cpu核数相同,将调用方法改为异步,改为异步有两个解决方案:
1、接口中调用的方法函数要是异步非阻塞的,配合异步库使用,比如
response1 = yield asynchttpclient.post(url)
response2 = yield asynchttpclient.post(url)
2、tornado提供excutor,可以将同步函数变为future对象
class TestHandler(BaseHandler): __class_name = sys._getframe().f_code.co_name def __init__(self, application, request, **kwargs): super(ActiveMQListenerHandler, self).__init__(application, request, **kwargs) self.conf = options.conf.api.get(self.__class_name) self.executor = ThreadPoolExecutor(self.conf.max_thread) # 用执行时的最大线程数,用于将同步方法变为返回future @gen.coroutine def post(self): print(444444) s = yield self.handleTest() print(555555) #run_on_executor会将下方方法变为future @run_on_executor def handleTest(self, *args): time.sleep(60)