【问题标题】:bottle + gevent not working asynchronously瓶子 + gevent 不能异步工作
【发布时间】:2017-01-31 21:38:30
【问题描述】:

我实现了一个带有事件回调功能的简单应用程序,但服务器无法同时处理请求。它等待第一个请求完成,然后再提供第二个请求。不知道我做错了什么。我以此为参考: 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 个问题导致它无法异步运行。必须安装 Libevent 并在触发请求时使用 2 个不同的浏览器。

标签: bottle gevent


【解决方案1】:

旧线程,但我遇到了同样的问题,以前的答案没用。 不过@user1522160 的评论是对的。

这个问题只出现在我的 chrome 上。如果我使用两个浏览器(或 safari 上的两个选项卡),bottle 会同时处理两个同时请求。

【讨论】:

    【解决方案2】:

    您的代码运行正常。我认为您对 server="gevent" 的作用感到困惑。

    如果您没有指定server="gevent",那么当您运行服务器并同时向服务器发出两个请求时,一个会挂起,直到另一个完成。 “对您的服务器的两个请求”是指同时从您的浏览器、curl 或 wget 访问它两次。

    server="gevent",如果您同时从两个客户端访问您的服务器,那么两个请求将同时得到服务。

    WSGI 本质上是单线程的,这就是为什么您会在非 gevent 情况下看到这种行为。


    现在,您似乎试图通过放入 gevent 队列来推迟每个请求期间的一些工作。这与server="gevent" 是分开的,与Bottle 或WSGI 无关。

    您还明确地告诉 gevent 休眠 5 秒,它很高兴地答应了。因此对您服务器的每个请求都将采用5 seconds * len(data)

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

    【讨论】:

    • 按照你给出的解释,我使用的是 gevent 服务器,def main():bottle.run(host='0',port=8081, server="gevent")。但我没有看到同时发出的请求发生并发回复。我错过了什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2017-12-28
    • 1970-01-01
    • 2019-03-13
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多