簡體   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