10

aiohttp 経由で 5 つのリクエストを行う次のコードを実行しています。

import aiohttp
import asyncio

def fetch_page(url, idx):
    try:
        url = 'http://google.com'
        response = yield from aiohttp.request('GET', url)

        print(response.status)
    except Exception as e:
        print(e)

def main():
    try:
        url = 'http://google.com'
        urls = [url] * 5

        coros = []
        for idx, url in enumerate(urls):
            coros.append(asyncio.Task(fetch_page(url, idx)))

        yield from asyncio.gather(*coros)
    except Exception as e:
        print(e)

if __name__ == '__main__':
    try:
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main())
    except Exception as e:
        print(e)

出力:

200
200
200
200
200
Exception ignored in: Exception ignored in: Exception ignored in: Exception ignored in: Exception ignored in:

注: 例外の内容と場所に関する追加情報はありません。

何が原因で、デバッグするためのヒントはありますか?

4

1 に答える 1

11

正確な理由はわかりませんが、aiohttp.ClientResponseオブジェクトを開いたままにしておくと、インタープリターの終了時に発生できない例外がスローされるようです。私のシステムでは、「例外は無視されました」というメッセージではなく、次のような警告が表示されます。

sys:1: ResourceWarning: unclosed <socket object at 0x7f44fce557a8>
sys:1: ResourceWarning: unclosed <socket object at 0x7f44fce55718>
sys:1: ResourceWarning: unclosed <socket object at 0x7f44fcc24a78>
sys:1: ResourceWarning: unclosed <socket object at 0x7f44fcc248c8>
sys:1: ResourceWarning: unclosed <socket object at 0x7f44fcc24958>
sys:1: ResourceWarning: unclosed <socket object at 0x7f44fcc249e8>
sys:1: ResourceWarning: unclosed <socket object at 0x7f44fcc24b08>

いずれにせよ、 を呼び出しClientResponseて、 の最後でオブジェクトを明示的に閉じることで修正できます。fetch_objectsresponse.close()

于 2015-04-07T23:33:30.560 に答える