如何解决瓶子和多个请求
我用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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。