首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用bottle-gevent处理多个请求?

如何使用bottle-gevent处理多个请求?
EN

Stack Overflow用户
提问于 2019-09-12 05:26:13
回答 1查看 592关注 0票数 0

我正在开发一个web服务,它在后端有巨大的计算。下面是瓶子框架和"Cherrypy“服务器的代码(多线程,非常稳定)。但在测试了一段时间后,我觉得它的服务速度没有我预期的那么快。使用"Cherrypy“的代码如下

代码语言:javascript
复制
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)可以解决相同的请求。它的代码如下所示

代码语言:javascript
复制
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处理来自其他机器的其他请求?

EN

回答 1

Stack Overflow用户

发布于 2019-09-19 23:13:33

你可能想得太多了。您想要使用路由装饰器。每个用户点击一条路线都会在他们自己的greenlet中。如果要确保这一点,可以使用gevent.spawn()调用函数

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57897020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档