皆さんこんにちは、
私は、いくつかのリクエストを送信し、結果を収集し、結果をいくつかの処理と組み合わせて、どこかに応答を返す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はすでにそれを行っています。
しばらくの間、アクティビティが発生しなかったため、チケットを閉じます。
最も参考になるコメント
grequests.map()
は、上記で提供したコードスニペットの短縮版です。それ以外は、
grequests
はあまり効果がありません。 これは主に、インポート時にプロセスにモンキーパッチを適用するために存在しますが、gunicornはすでにそれを行っています。