Gunicorn: 关于 gevent worker 的 IO 绑定进程的问题

创建于 2019-04-15  ·  3评论  ·  资料来源: benoitc/gunicorn

大家好,

我正在开发一个 API,它发送多个请求、收集结果并将结果与​​一些处理相结合,并在某处返回响应。 我正在使用 greenlet worker,因为该进程显然是 IO 绑定的。

从我所读到的,每个处理 gunicorn 请求的 greenlet 就像一个线程,所以当 IO 阻塞调用必须等待 IO 时,greenlet 将阻塞该特定的 gunicorn 请求。 因此,例如在我的应用程序的处理程序中(顺便说一句,使用烧瓶),我有几个requests.get(...) greenlet 将阻塞到下一个requests.get()

def fetch(pid):
    response0 = requests.get('http://some-micro-service-0.com/')
    response1 = requests.get('http://some-micro-service-1.com/')
    response2 = requests.get('http://some-micro-service-2.com/')
    return combine_response(response0, response1, response2)

我可以使用 grequests 尝试向处理程序添加更多并发性,以改善延迟(这是我正在寻找的东西)。 但是你对如何做到这一点有什么建议吗?

您对如何收集多个请求有什么建议吗?

最有用的评论

我可以使用 grequests 尝试向处理程序添加更多并发性,

grequests.map()是我上面提供的代码片段的速记版本。

除此之外, grequests没有太大作用。 它的存在主要是为了在导入时修补进程,但 gunicorn 已经这样做了。

所有3条评论

gevent有一个示例,用于并行分派多个请求,并且仅在完成后才继续进行。

(您的情况会略有不同,您将返回response而不是打印它然后将它们组合起来。)

但是我们实际上可以使用Group.map api 更简单:

from gevent import pool

jobs = pool.Group()
responses = jobs.map(requests.get, 
                     ('http://one', 'http://two', 'http://three'))

我可以使用 grequests 尝试向处理程序添加更多并发性,

grequests.map()是我上面提供的代码片段的速记版本。

除此之外, grequests没有太大作用。 它的存在主要是为了在导入时修补进程,但 gunicorn 已经这样做了。

关闭票据,因为一段时间以来没有发生任何活动。

此页面是否有帮助?
0 / 5 - 0 等级