3

aiohttp の readme には次のように書かれています。

aiohttp クライアントにタイムアウトを使用する場合は、標準の asyncio アプローチを使用してください: yield from asyncio.wait_for(client.get(url), 10)

しかし、それはOSによって処理されるDNSタイムアウトを処理しません。また、with aiohttp.TimeoutOS DNS ルックアップも処理しません。

asyncio リポジトリで最終的な結論なしに議論があり、 Saghul はaiodnsを作成しましたが、それを aiohttp に混在させる方法と、それが機能を許可するかどうかはわかりませんasyncio.wait_for

テストケース (私の Linux ボックスでは 20 秒かかります):

async def fetch(url):
    url = 'http://alicebluejewelers.com/'
    with aiohttp.Timeout(0.001):
        resp = await aiohttp.get(url)
4

1 に答える 1

4

Timeout期待どおりに動作しますが、残念ながらあなたの例はPythonのシャットダウン手順でハングします.DNSルックアップを実行するバックグラウンドスレッドの終了を待ちます.

aiodns解決策として、手動の IP 解決に使用することをお勧めします。

import asyncio
import aiohttp
import aiodns

async def fetch():
    dns = 'alicebluejewelers.com'
    # dns = 'google.com'
    with aiohttp.Timeout(1):
        ips = await resolver.query(dns, 'A')
        print(ips)
        url = 'http://{}/'.format(ips[0].host)
        async with aiohttp.get(url) as resp:
            print(resp.status)

loop = asyncio.get_event_loop()
resolver = aiodns.DNSResolver(loop=loop)
loop.run_until_complete(fetch())

オプション機能として TCPConnector に含める価値のあるソリューションかもしれません。

プルリクエスト大歓迎です!

于 2016-01-10T03:12:05.147 に答える