2017-01-31 3 views
5

mapとの違いは、mapはすべてのリクエストが完了するのを待ってから、注文データを返します。 imapはすぐにデータを返し、より少ない注文を出します。imapとgrequestsライブラリのマップ

私が使用:

urls = [...some_data...] 
rs = (grequests.get(u,, hooks=dict(response=callback_f)) for u in urls) 
r = grequests.map(rs) 

フックは、すぐにすべての要求を終えるとして使用され、コールバック関数が呼び出されます。

私が使用します。その後、単一のリクエストが送信されない

urls = [...some_data...] 
rs = (grequests.get(u,, hooks=dict(response=callback_f)) for u in urls) 
r = grequests.imap(rs) 

ドキュメントマップとimapによれば、excatly同じAPIを持っています。

これは予期された動作ですか?私はimapでフックを使わないべきですか? 私はPython 3.5を使用しています。

答えて

3

は、私の知る限りではmapimapとの違いは、すべての要求のためのmap待機が終了するということです、その後、注文したデータを返します。 imapはすぐにデータを返し、より少ない注文を出します。

これは本当に真ではありません。 mapはすべてのリクエストを即時に行い、結果を返します(これは時間がかかるため、「すべてのリクエストが完了するのを待つ」と言われています)。

imapは、オンデマンドでとなります。したがって、それらを得るために結果をループする必要があります:しかし、各イテレーションは1つのリクエストだけが行われます:

for single_request in r: 
    # so something with "single_request" 
+0

したがって、すべてのリクエストを同時に発行する方法はありません。 – maax

+1

これは同時に実行する必要があるリクエストの数を指定するパラメータ 'size'を持っています。最低でも "Nullege Python Samples"の['grequests.imap'による](http://nullege.com/codes/search/grequests.imap) – MSeifert

+0

@MSeifert私も' .imap(...、size = 1) 'という巨大な要求で、バックグラウンドで次々に送られます。 – Winand