【问题标题】:How to handle multiple requests using bottle-gevent?如何使用bottle-gevent处理多个请求?
【发布时间】:2020-12-16 00:47:44
【问题描述】:

我正在开发一个在后端有大量计算的网络服务。下面是带有瓶子框架和“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 服务器估计需要 40000 毫秒的响应时间。这是一个巨大的时间。 所以我打算使用“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 接受单个请求并以最短时间发送对请求的响应?

【问题讨论】:

    标签: python bottle cherrypy gevent


    【解决方案1】:

    你可能想多了。你想使用路由装饰器。每个点击路线的用户都将在他们自己的 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()
    

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 2018-08-19
      • 2013-01-12
      • 2013-01-31
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多