我正在开发一个web服务,它在后端有巨大的计算。下面是瓶子框架和"Cherrypy“服务器的代码(多线程,非常稳定)。但在测试了一段时间后,我觉得它的服务速度没有我预期的那么快。使用"Cherrypy“的代码如下
from bottle import Bottle
import logging.handlers
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# Logging handler for files
file_handler = logging.handlers.TimedRotatingFileHandler("Log.log", when="midnight", interval=1,
backupCount=10000)
file_handler.setLevel(logging.INFO)
# Formatter's for logging
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
file_handler.setFormatter(formatter)
# Add handlers to the logger
logger.addHandler(file_handler)
class App:
def __init__(self, server, host, port):
self._app = Bottle()
self._host = host
self._port = port
self._server = server
self._route()
def start(self):
self._app.run(server=self._server, host=self._host, port=self._port)
logger.info("Application Started Successfully.")
def _route(self):
self._app.route('/hello/<name>', method="POST", callback=self.hello)
def hello(self, name):
print("hello ", name)
logger.info("completed the response")
if __name__ == '__main__':
server = App(server='cheroot', host='0.0.0.0', port=9999)
server.start()我正在开发的Web服务同时被多个请求调用。Cherrypy服务器正在运行,估计响应需要40000ms。这是一个巨大的时刻。所以我计划使用"Gevent“服务器(异步)。但我正面临一个问题,即多线程(GREENLET)可以解决相同的请求。它的代码如下所示
from bottle import Bottle
import logging.handlers
from gevent import monkey
monkey.patch_all()
class App:
def __init__(self, server, host, port):
self._app = Bottle()
self._host = host
self._port = port
self._server = server
self._route()
def start(self):
self._app.run(server=self._server, host=self._host, port=self._port)
logger.info("Application Started Successfully.")
def _route(self):
self._app.route('/hello/<name>', method="POST", callback=self.hello)
def hello(self, name):
print("hello ", name)
logger.info("completed the response")
if __name__ == '__main__':
server = App(server='gevent', host='0.0.0.0', port=9999)
server.start()单次请求的实际时间是9000ms,所以时间增加到40000ms,有时甚至更多,这让我选择gevent。
如何控制GREENLET接受单个请求,并在最短的时间内向该请求发送响应,同时其他GREENLET处理来自其他机器的其他请求?
发布于 2019-09-19 23:13:33
你可能想得太多了。您想要使用路由装饰器。每个用户点击一条路线都会在他们自己的greenlet中。如果要确保这一点,可以使用gevent.spawn()调用函数
import gevent
from gevent import monkey, signal
monkey.patch_all()
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
import bottle
from bottle import get, post, template, request, response
import logging.handlers
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# Logging handler for files
file_handler = logging.handlers.TimedRotatingFileHandler("Log.log", when="midnight", interval=1,
backupCount=10000)
file_handler.setLevel(logging.INFO)
# Formatter's for logging
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
file_handler.setFormatter(formatter)
# Add handlers to the logger
logger.addHandler(file_handler)
@get('/hello/<name>')
@post('/hello/<name>')
def _hello(self, name):
print("hello ", name)
logger.info("completed the response")
return "hello {}".format(name)
if __name__ == '__main__':
botapp = bottle.app()
server = WSGIServer(("0.0.0.0", 9999), botapp, handler_class=WebSocketHandler)
def shutdown():
print('Shutting down ...')
server.stop(timeout=60)
exit(signal.SIGTERM)
gevent.signal(signal.SIGTERM, shutdown)
gevent.signal(signal.SIGINT, shutdown) # CTRL C
logger.info("Application Started Successfully.")
server.serve_forever()https://stackoverflow.com/questions/57897020
复制相似问题