0

ここでは、設定に合わせていくつかの変更を加えたいと思います。

サーバーに対して行われた単一のリクエスト内で複数の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)
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 に答える