2017-10-02 4 views
0

Pythonでリクエストライブラリを使用して非同期HTTPリクエストを実行しようとしています。私は、ライブラリの最後のバージョンが非同期要求を直接サポートしていないことに気付きました。それを実現するために、非同期を処理するためにTwistedを使用する要求スレッドライブラリが用意されています。私は、await/yieldの代わりにコールバックを使用するために提供されたサンプルを修正しようとしましたが、コールバックは呼び出されていません。Pythonリクエストを使用して遅延コールバックが呼び出されない-threads

私のサンプルコードは次のとおりです。

session = AsyncSession(n=10) 

def processResponse(response): 
    print(response) 

def main(): 
    a = session.get('https://reqres.in/api/users') 
    a.addCallbacks(processResponse, processResponse) 
    time.sleep(5) 

リクエスト・スレッドライブラリ:https://github.com/requests/requests-threads

答えて

2

私はあなたが(reactorとして知られている)ツイストのイベントループを実行していないため、コールバックが呼び出されていない疑いがあります。あなたの睡眠機能を削除し、それをreactor.run()に置き換えてください。

from twisted.internet import reactor 
# ... 
def main(): 
    a = session.get('https://reqres.in/api/users') 
    a.addCallbacks(processResponse, processResponse) 
    #time.sleep(5) # never use blocking functions like this w/ Twisted 
    reactor.run() 

キャッチを使用して、イベントループ(すなわち。reactor.stop())を停止し、一度ので、ツイストの原子炉は、再起動できないですreactor.run()が再度実行された場合、例外が発生します。言い換えれば、あなたのスクリプト/アプリは「一度だけ」実行されます。この問題を回避するには、crochetを使用することをおすすめします。ここでrequests-threadから同様の例を使用した簡単な例です:

import crochet 
crochet.setup() 
print('setup') 

from twisted.internet.defer import inlineCallbacks 
from requests_threads import AsyncSession 

session = AsyncSession(n=100) 

@crochet.run_in_reactor 
@inlineCallbacks 
def main(reactor): 
    responses = [] 
    for i in range(10): 
     responses.append(session.get('http://httpbin.org/get')) 

    for response in responses: 
     r = yield response 
     print(r) 

if __name__ == '__main__': 
    event = main(None) 
    event.wait() 

そして、ちょうどFYI requests-threadとしては、生産システムのためのものではなく、(2017年10月のような)大きな変化にさらされます。このプロジェクトの最終目標は、将来的にはrequestsのために待つことができるデザインパターンを設計することです。実稼動準備完了の同時要求が必要な場合は、grequestsまたはtreqと考えてください。

0

私はここでの唯一のミスはあなたがreactor/event loopを実行するのを忘れたということだと思います。

次のコードは、私の作品:

from twisted.internet import reactor 
from requests_threads import AsyncSession 

session = AsyncSession(n=10) 


def processResponse(response): 
    print(response) 


a = session.get('https://reqres.in/api/users') 
a.addCallbacks(processResponse, processResponse) 
reactor.run() 
関連する問題