1. ホーム
  2. python

[解決済み] asyncioでrequestsを使うにはどうしたらいいですか?

2022-04-21 17:18:19

質問

の中で、httpリクエストのタスクを並行して行いたいのですが。 asyncio しかし python-requests のイベントループをブロックしてしまいます。 asyncio . 私が見つけたのは aiohttp しかし、それはhttpプロキシを使用して、httpリクエストのサービスを提供することができませんでした。

そこで asyncio .

解決方法は?

asyncioでリクエスト(または他のブロックライブラリ)を使用するには、次のようにします。 BaseEventLoop.run_in_executor を使用すると、別のスレッドで関数を実行し、そこから結果を得ることができます。例えば

import asyncio
import requests

@asyncio.coroutine
def main():
    loop = asyncio.get_event_loop()
    future1 = loop.run_in_executor(None, requests.get, 'http://www.google.com')
    future2 = loop.run_in_executor(None, requests.get, 'http://www.google.co.uk')
    response1 = yield from future1
    response2 = yield from future2
    print(response1.text)
    print(response2.text)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

これにより、両方のレスポンスが並行して取得されます。

Python 3.5では、新しいメソッドである await / async の構文があります。

import asyncio
import requests

async def main():
    loop = asyncio.get_event_loop()
    future1 = loop.run_in_executor(None, requests.get, 'http://www.google.com')
    future2 = loop.run_in_executor(None, requests.get, 'http://www.google.co.uk')
    response1 = await future1
    response2 = await future2
    print(response1.text)
    print(response2.text)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

参照 PEP0492 をご覧ください。