代码非常简单,这是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。
答案 0 :(得分:1)
您的代码中没有任何等待时间,实际上您获得了100%的CPU使用率。您正在发出并提供CPU可以处理的请求。
你可以在req.GetEmpty()为100个线程获得大约100 req / s之后在循环中添加time.sleep(1)(你实际上会得到更少,但你可以调整它)。