gpt4 book ai didi

python - cherrypy 是如何工作的?当并发率低时,与 Tornado 相比,它可以很好地处理请求

转载 作者:太空狗 更新时间:2023-10-29 21:57:20 26 4
gpt4 key购买 nike

我对 cherrypy(使用 web.py 作为框架)和 tornado 从互联网上检索网页进行了测试。

我有三个测试用例使用 siege 向服务器发送请求(-c 表示用户数;-t 是测试时间)。代码在测试结果下方。

1。 web.py (cherrpy)

  siege ip -c20 -t100s             server can handle 2747requests  
siege ip -c200 -t30s server can handle 1361requests
siege ip -c500 -t30s server can handle 170requests

2。 Tornado 同步

  siege ip -c20 -t100s             server can handle 600requests  
siege ip -c200 -t30s server can handle 200requests
siege ip -c500 -t30s server can handle 116requests

3。 Tornado 异步

  siege ip -c20 -t100s             server can handle 3022requests  
siege ip -c200 -t30s server can handle 2259requests
siege ip -c500 -t30s server can handle 471requests

性能分析:

tornado 同步 < web.py (cherrypy) < tornado 异步

问题一:

我知道,使用异步架构可以显着提高网络服务器的性能。

我很好奇 tornado 异步架构和 web.py (cherry) 之间的区别。

我认为 tornado 同步模式会一个一个地处理请求,但是 cherrypy 是如何工作的,使用多线程?但是我并没有看到显存有很大的增加。 Cherrypy 可能同时处理多个请求。它是如何解决程序阻塞的?

问题2:

我可以在不使用异步技术的情况下提高 tornado 同步模式的性能吗?我认为 Tornado 可以做得更好。

Web.py代码:

import web
import tornado.httpclient
urls = (
'/(.*)', 'hello'
)
app = web.application(urls, globals())

class hello:
def GET(self, name):
client = tornado.httpclient.HTTPClient()
response=client.fetch("http://www.baidu.com/")
return response.body

if __name__ == "__main__":
app.run()

Tornado 同步:

import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
client = tornado.httpclient.HTTPClient()
response = client.fetch("http://www.baidu.com/" )
self.write(response.body)


if __name__=='__main__':
tornado.options.parse_command_line()
app=tornado.web.Application(handlers=[(r'/',IndexHandler)])
http_server=tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

Tornado 异步:

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
from tornado.options import define, options
define("port", default=8001, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
client = tornado.httpclient.AsyncHTTPClient()
response = client.fetch("http://www.baidu.com/" ,callback=self.on_response)

def on_response(self,response):
self.write(response.body)
self.finish()

if __name__=='__main__':
tornado.options.parse_command_line()
app=tornado.web.Application(handlers=[(r'/',IndexHandler)])
http_server=tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

最佳答案

回答问题 1...

Tornado 是单线程的。如果您阻塞主线程,就像您在同步示例中所做的那样,那么在阻塞调用返回之前,该单个线程将无法执行任何操作。这将同步示例限制为一次一个请求。

我对web.py不是特别熟悉,但是看the source for its HTTP server它似乎正在使用线程混合,这表明它不限于一次处理一个请求。当第一个请求进来时,它由一个线程处理。该线程将阻塞,直到 HTTP 客户端调用返回,但其他线程可以自由处理进一步的传入请求。这允许一次处理更多请求。

我怀疑如果您使用 Tornado 模拟这一点,例如,通过将 HTTP 客户端请求传递给线程池,那么您会看到类似的吞吐量。

关于python - cherrypy 是如何工作的?当并发率低时,与 Tornado 相比,它可以很好地处理请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13522495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com