2017-03-16 7 views
0

2.7と3.xで動作するパッケージを書く必要があります。パッケージには、ポストリクエストを非同期で行うメソッドが必要です。これは可能ですか?私はリクエスト先物を使ってみましたが、複数のリクエストを試してみるとエラーになります。私もgrequestsを試しましたが、私は要求をすることさえできませんでした。非同期メソッドを持つパッケージを作成するにはどうすればよいですか?

は、それはこのようになります:

my_package.py

def _make_request(payload): 
    requests.post(
     SERVICE_URL, 
     data=json.dumps(payload), 
    ) 

def do_thing_a(): 
    _make_request(some_payload) 

def do_thing_b(): 
    _make_request(some_other_payload) 

code_that_uses_my_package.py

do_thing_a() 
    do_thing_b() 

私は要求を使用している場合、同期、これは正常に動作します。 request-futuresを使用して、各メソッドに session = FuturesSession()行を追加し、requests.postをsession.postに変更すると、このエラーが発生します。

TypeError: 'NoneType' object is not callable 
<async at 0x3f657f0> failed with TypeError 

非同期呼び出しを1つだけ行うと動作しますが、 grequestsを試してgrequests.post + greqeuests.sendを使用すると、何も起こりません。

何か間違っていますか?これを行うためのライブラリがありますか?

+1

[Twisted](https://twistedmatrix.com/trac/)のようなWoiuldのヘルプはありますか?grequests.imapを参照してください。 – tadman

答えて

0

私はgrequestsがあなたのために働いていなかった理由に答えるつもりです。 grequests.sendを使用するのはちょっと難しいです。応答オブジェクトは応答が返るまで空になるので、ちょっとハッキリな応答オブジェクトをチェックしておく必要があります。これはおそらく、何もしていないように見える理由です。

代わりにgrequests.mapを使用してください。それは応答を待っている間はブロックされませんが、すべての要求が返るまで次の行は実行されません。複数のリクエストがある場合は、grequests.mapと一緒に送信し、非同期で実行します。ここにあなたのコードサンプルと例を示します

def _make_request(payload): 
    return grequests.post(
     SERVICE_URL, 
     data=json.dumps(payload), 
    ) 

def do_thing_a(): 
    return _make_request(some_payload) 

def do_thing_b(): 
    return _make_request(some_other_payload) 

reqs = [do_thing_a(), do_thing_b()] 
grequests.map(reqs) 
print reqs[0].response, reqs[1].response 

reqが複数の要求を含める必要はありません、それは単一の要素を持つリストになります。

関連する問題