【问题标题】:Bottle and multiple requests瓶子和多个请求
【发布时间】:2020-10-13 05:57:01
【问题描述】:

我用Bottle开发了一个API,有些请求需要很长时间才能发送响应,问题是如果在此期间我发送另一个短请求,我必须等到第一个请求完成。

这是一个例子:

from gevent import monkey
monkey.patch_all()
from bottle import route, run


@route('/test', method='GET')
def test():
    return 'hello'


@route('/loop', method='GET')
def loop():
    for i in range(0, 1000000000):
        a = 0


if __name__ == '__main__':

    run(host='127.0.0.1', port=45677, debug=True, server='gevent')

如果您运行 /loop 然后 /test 您将必须等到 /loop 完成才能获得 /test 响应。

我尝试了很多服务器,总是同样的问题。

我做错了什么?感谢您的帮助。

【问题讨论】:

    标签: python bottle


    【解决方案1】:

    您需要了解异步方法。例如gevent async 并不意味着多线程,所以任何需要 CPU 的东西仍然会阻塞。但这对于依赖 IO 的东西来说非常有用,比如 SQL 查询。

    因此,在您的 for 循环中,因为这仅仅是 cpu 绑定,除非您提供 sleep 条件以允许其他上下文在此过程中运行,否则您将一直阻塞直到它结束。

    import gevent
    from gevent import monkey,spawn as gspawn, sleep as gsleep, socket, signal_handler as sig
    monkey.patch_all()
    import signal
    from bottle import Bottle, static_file, get, post, request, response, template, redirect, hook, route, abort
    from gevent.pywsgi import WSGIServer
    from geventwebsocket.handler import WebSocketHandler
    
    
    def sample():
        gspawn(myfunc)
    
    
    @get('/')
    def app():
        return 'Hello World!'
    
    @get('/test')
    def test():
        return 'hello'
    
    @route('/loop')
    def loop():
        for i in range(0, 1000000000):
            gsleep(0)
            a = 0
    
     if __name__ == '__main__':
        botapp = bottle.app()
        server = WSGIServer(("0.0.0.0", int(port)), botapp , handler_class=WebSocketHandler)
        def shutdown():
            print('Shutting down ...')
            server.stop(timeout=60)
            exit(signal.SIGTERM)
        sig(signal.SIGTERM, shutdown)
        sig(signal.SIGINT, shutdown)
        server.serve_forever()
    

    【讨论】:

    • 感谢您的帮助,它适用于测试代码,但不适用于我的 API,我必须这样做 gevent.sleep(0.001)。还有其他多线程解决方案吗?我尝试使用multiprocessing.Process() 为循环函数创建一个进程,但这是同样的问题。
    • 如果在我的循环函数中我有一个很长的 MySQL 请求,它不能解决问题:/
    • 您是否正在为您的请求生成新的上下文?如果您使用到 MYSQL 的线程连接,长 SQL 查询将不会阻塞
    • 我将它用于 postgres:stackoverflow.com/questions/48532301/…
    • 我正在使用 MySQLdb,我会检查上下文,谢谢
    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多