Tornado占用完整的CPU使用率并且不能接受并发

时间:2016-01-19 07:29:56

标签: python linux http web tornado

代码非常简单,这是Tornado的基本用法:

class JustHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('just get.')

application = tornado.web.Application([
    (r"/just", JustHandler),
])
application.listen(7777)
tornado.ioloop.IOLoop.current().start()

我写了一个简单的客户端来发送请求:

class Request:
    def GetEmpty(self):
        try:
            req  = urllib2.Request('http://localhost:7777/just')
            resp = urllib2.urlopen(req, timeout = 15)
            file = resp.read()
            print 'Get empty'
        except Exception,e:
            print str(e)

def ReqThread():
    req = Request()
    while True:
        req.GetEmpty()

if __name__ == "__main__":
    print 'start.'
    threads = []
    for i in range(0, 100):
        thread = threading.Thread(target = ReqThread)
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()
    print 'end.'

如你所见,我打开了100个线程,每个线程都有循环请求而没有结束,然后检查龙卷风的CPU使用率,它是100%。

如果我尝试增加线程数,某些请求将因超时而失败。

我错了什么?龙卷风应该同时接受高重新设定。

我的系统是Ubuntu 14.04,Tornado版本是4.2.1,CPU是E3 1231 v3。

1 个答案:

答案 0 :(得分:1)

您的代码中没有任何等待时间,实际上您获得了100%的CPU使用率。您正在发出并提供CPU可以处理的请求。

你可以在req.GetEmpty()为100个线程获得大约100 req / s之后在循环中添加time.sleep(1)(你实际上会得到更少,但你可以调整它)。