繁体   English   中英

瓶子和多个请求

[英]Bottle and multiple requests

我用 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 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM