我实现了一个具有事件回调功能的简单应用程序,但服务器不能同时为请求提供服务。它等待第一个请求完成,然后再为第二个请求提供服务。不确定我做错了什么。我使用这个作为参考: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()谢谢
发布于 2017-01-31 21:38:30
旧线程,但我有同样的问题,之前的答案是无用的。然而,@user1522160的评论是正确的。
这个问题只在我的chrome上出现。如果我使用两个浏览器(或者safari上的两个标签),瓶子会同时处理两个请求。
发布于 2015-06-12 12:30:22
您的代码完全按照它应该的方式工作。我想你对server="gevent"做了什么感到困惑。
如果您没有指定server="gevent",那么当您运行服务器并同时向服务器发出两个请求时,一个请求将挂起,直到另一个请求完成。我所说的“对你的服务器的两个请求”的意思是同时命中它两次,要么来自你的浏览器,要么来自curl,或者来自wget。
使用server="gevent",如果您同时从两个客户端访问您的服务器,那么这两个请求将同时得到服务。
WSGI本质上是单线程的,这就是为什么你会在非gevent的情况下看到这种行为。
现在,您似乎还试图在每个请求期间延迟一些工作,将其放入gevent队列中。这是独立于server="gevent"的,与Bottle或WSGI没有任何关系。
您还显式地告诉gevent休眠5秒,它很乐意这样做。因此,对您的服务器的每个请求都将采用5 seconds * len(data)。
希望这是有意义的。祝好运!
https://stackoverflow.com/questions/30767486
复制相似问题