Gunicorn: geventワーカーによるIOバウンドプロセスに関する質問

作成日 2019年04月15日  ·  3コメント  ·  ソース: benoitc/gunicorn

皆さんこんにちは、

私は、いくつかのリクエストを送信し、結果を収集し、結果をいくつかの処理と組み合わせて、どこかに応答を返すAPIに取り組んでいます。 プロセスが明らかにIOバウンドであるため、私はグリーンレットワーカーを使用しています。

私が読んだところによると、gunicornリクエストを処理する各グリーンレットはスレッドのように機能するため、IOブロッキング呼び出しがIOを待機する必要がある場合は常に、グリーンレットはその特定のgunicornリクエストをブロックします。 たとえば、私のアプリのハンドラー(フラスコbtwを使用)では、いくつかのrequests.get(...) 、グリーンレットは次の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には、複数のリクエストを並行してディスパッチし、それらが完了したら1回だけ続行

(ケースは少し異なります。印刷する代わりに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 評価