我使用事件回调工具实现了一个简单的应用程序,但服务器无法同时提供请求。它等待第一个req在服务第二个之前完成。不确定我做错了什么。我用这个作为参考: http://bottlepy.org/docs/dev/async.html
import time
from gevent import monkey; monkey.patch_all()
import bottle
from gevent import Greenlet
from gevent import pywsgi
from gevent import queue
import gevent
def worker(body):
print 'worker called'
data = [ 'one', 'two', 'three', 'four' ]
for d in data:
body.put(d)
gevent.sleep(5)
body.put(StopIteration)
@bottle.route('/')
def def1():
body = gevent.queue.Queue()
g = Greenlet.spawn(worker, body)
return body
def main():
bottle.run(host='0',port=8081, server="gevent")
if __name__ == '__main__':
main()
由于
答案 0 :(得分:0)
此问题仅出现在Chrome上。如果我使用两个浏览器(或Safari上的两个选项卡),则会同时处理两个同时发出的请求。
答案 1 :(得分:-1)
您的代码完全按预期工作。我认为你对server="gevent"
的作用感到困惑。
如果您没有指定server="gevent"
,那么当您运行服务器并同时向服务器发出两个请求时,会挂起,直到另一个完成。通过“对您的服务器的两个请求”,我的意思是同时从浏览器或curl或wget点击两次。
使用 server="gevent"
,如果您同时从两个客户端访问服务器,则两个请求将同时进行服务。
WSGI本质上是单线程的,这就是为什么你在非gevent案例中看到这种行为的原因。
现在,您似乎还尝试通过放入gevent队列来推迟每个请求中的某些工作。这与server="gevent"
是分开的,与Bottle或WSGI无关。
你也明确告诉gevent睡了5秒钟,并且很乐意。因此,每次向您的服务器发送的请求都需要5 seconds * len(data)
。
希望这是有道理的。祝你好运!