首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bottle + gevent不能异步工作

bottle + gevent不能异步工作
EN

Stack Overflow用户
提问于 2015-06-11 05:17:55
回答 2查看 1.3K关注 0票数 2

我实现了一个具有事件回调功能的简单应用程序,但服务器不能同时为请求提供服务。它等待第一个请求完成,然后再为第二个请求提供服务。不确定我做错了什么。我使用这个作为参考:http://bottlepy.org/docs/dev/async.html

代码语言:javascript
复制
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()

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-01-31 21:38:30

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

这个问题只在我的chrome上出现。如果我使用两个浏览器(或者safari上的两个标签),瓶子会同时处理两个请求。

票数 0
EN

Stack Overflow用户

发布于 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)

希望这是有意义的。祝好运!

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30767486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档