bottle + gevent不能异步工作

时间:2015-06-10 21:17:55

标签: bottle gevent

我使用事件回调工具实现了一个简单的应用程序,但服务器无法同时提供请求。它等待第一个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()

由于

2 个答案:

答案 0 :(得分:0)

旧的线程,但我有同样的问题,以前的答案是无用的。 但@ user1522160的评论是正确的。

此问题仅出现在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)

希望这是有道理的。祝你好运!

相关问题