2016-11-28 8 views
3

を投稿するタスクは次のとおりです。複数のHTTP GETと

1)send an http get to url based on a parameter 
2)Modify the response based on the same parameter 
3)send an http post to url based on the same parameter 

私は現在、リクエストライブラリを介してこれをやっているが、それは1で、このいずれかを実行するために多くの時間を取り、それが20,000件まですることができます。

私はmultiprocessingを試しましたが、何らかの理由で5000-10000の送信後にハングします。

私はgrequestについて読んだが、それはそこにあると言う。 Order of these responses does not map to the order of the requests you send out.。私は私が送られたものに基づいてそれぞれの応答を修正しなければならないので、注文が必要です。

何ここでの最良の選択肢である?私はあまりにについてthreading,tornadoを読みましたが、私はmultiprocessingで私の最初のアプローチを台無しにしていると私はここで再びその上に

+0

ここで、応答の順序が要求の順序と一致しないことがわかりますか?私はGitHubページでそれを見ていないと[これ](http://stackoverflow.com/questions/37502384/are-grequests-responses-in-the-same-order-as-the-requests)は矛盾しています。編集:気にしない、私は同じ順序でそれらを返すことはありませんが表示されます。 – PeteyPii

+0

@PeteyPiiこれは、わからないことです...「imap」または「map」のためだけです。最後に、「imapのAPIはマップのAPIと同等です」 – vks

+0

ソースは私にはマップがリクエストと同じ順序を維持していることを示唆しているようです。 – PeteyPii

答えて

1

を取得する前に確認したいことは、あなたがすることを可能にするソリューションです。 grequestのimap(grequestのマップ関数よりも理論的に速い)を使用し、要求に対する応答をマップするためのインデックスを知っている。信用度はquestion asked on the project's GitHub issuesです。

from functools import partial 

def callback(index, response, **kwargs): 
    response.image_index = index 

rs = [ 
    grequests.get(
     url, 
     callback=partial(callback, index) 
    ) 
    for index, url in enumerate(urls) 
] 

お客様のニーズに合わせて調整する必要があります。

編集: hooksでこれを正常に使用しました。

grequests.get(
     url,hooks={'response': partial(process_response, index)}) 
+0

これで注文は維持されませんが、各回答を処理して修正することができますか? – vks

+0

ええ、それはうまくいくはずです(私はそれを自分で試みたことはありません) – PeteyPii