在这里,我想为我的设置做一些修改。
我希望在向我的服务器发出的单个请求中获得多个 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)