10

requestsセロリでPythonを使用しworkersて、多数の(〜10 /秒)API呼び出し(GET、POST、PUT、DELETEを含む)を行っています。各リクエストが完了するまでに約 5 ~ 10 秒かかります。

eventletプールで 1000 の同時実行性でセロリ ワーカーを実行してみました。

requestsプロセスをブロックしているため、各同時接続は 1 つの要求を待機しています。

どうすればrequests非同期にできますか?

4

2 に答える 2

17

eventletモンキー パッチを使用して、純粋な Python ライブラリをノンブロッキングにします。

  • パッチ単一ライブラリ

    # import requests  # instead do this:
    import eventlet
    requests = eventlet.import_patched('requests')
    

    パッケージerequestsgrequestsは、これらの 2 行にまで削除できます。

  • すべてにパッチを当てる

    import eventlet
    eventlet.monkey_patch()  # must execute as early as possible
    ...
    # everything is non-blocking now:
    import requests, amqp, memcache, paramiko, redis
    

更新:モンキー パッチ リクエスト ライブラリには既知の問題があります。あなたが取得する場合:

ImportError: cannot import name utils

、次にインポート行を次のように変更します

requests = eventlet.import_patched('requests.__init__')
于 2015-02-04T22:31:09.190 に答える
2

ドキュメントから:

Requests を Python の非同期性フレームワークの 1 つと組み合わせたプロジェクトはたくさんあります。2 つの優れた例は、 grequestrequests-future です。

特に eventlet の場合はerequestsを使用できます。

于 2015-02-04T07:26:26.683 に答える