0

在这里,我想为我的设置做一些修改。

我希望在向我的服务器发出的单个请求中获得多个 API 调用的响应。从所有这些 API 调用中,我想组合结果并将它们作为响应返回。到这里为止,几乎所有内容都遵循 gevent 文档的示例和这里的示例。现在这里的问题是我想以增量方式传递响应,所以如果第一个 API 调用返回了结果,我将在一个等待已久的请求中将此结果返回到前端,然后等待其他 API 调用并将它们在同一个请求中传递给前端。

我试图通过代码来做到这一点,但我不知道如何进行此设置。gevent.joinall().join()阻塞,直到所有 greenlet 都完成响应。

在此设置中我可以通过什么方式继续使用 gevent ?

我在这里使用的代码在链接https://bitbucket.org/denis/gevent/src/tip/examples/concurrent_download.py上给出。在这里.joinall(),最后一条语句中的等待直到所有 url 都有完整的响应,我希望它是非阻塞的,以便我可以在回调函数 print_head() 中处理响应并逐步返回它们。

#!/usr/bin/python
# Copyright (c) 2009 Denis Bilenko. See LICENSE for details.

"""Spawn multiple workers and wait for them to complete"""

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

import gevent
from gevent import monkey

# patches stdlib (including socket and ssl modules) to cooperate with other greenlets
monkey.patch_all()

import urllib2


def print_head(url):
    print ('Starting %s' % url)
    data = urllib2.urlopen(url).read()
    print ('%s: %s bytes: %r' % (url, len(data), data[:50]))

jobs = [gevent.spawn(print_head, url) for url in urls]

gevent.joinall(jobs)
4

1 回答 1

1

如果要从多个greenlet中收集结果,则修改print_head()为返回结果,然后使用.get()方法将它们全部收集。

把它放在后面joinall()

total_result = [x.get() for x in jobs]

实际上,joinall()在这种情况下甚至没有必要。

如果print_head()看起来像这样:

def print_head(url):
    print ('Starting %s' % url)
    return urllib2.urlopen(url).read()

然后total_result将是一个大小为 3 的列表,其中包含所有请求的响应。

于 2011-11-09T10:43:51.693 回答