ここでは、設定に合わせていくつかの変更を加えたいと思います。
サーバーに対して行われた単一のリクエスト内で複数のAPI呼び出しからの応答が必要です。これらすべてのAPI呼び出しから、結果を組み合わせて応答として返したいと思います。ここまでは、geventのドキュメントの例とここに示されているように、ほとんどすべてが続きます。ここでの落とし穴は、応答を段階的に渡したいということです。したがって、最初のAPI呼び出しが結果を返した場合、この結果を1つの長い待機リクエストでフロントエンドに返し、他のAPI呼び出しを待って、同じリクエストでそれらを渡します。フロントエンド。
私はコードを介してこれを実行しようとしましたが、この設定を続行する方法がわかりません。すべてのグリーンレットが応答を取得し終えるまで、gevent.joinall()
とblockを実行します。.join()
この設定で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)