瓶子和多个请求

问题描述

我用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响应。

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

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

解决方法

您需要了解异步方法。例如,使用gevent异步并不意味着多线程,因此任何需要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()