Windows 上の Python 3.4 で asyncio と aiohttp を使用する https 要求の場合、2 つのイベント ループを使用する必要があります。シェル コマンドを実行するための ProactorEventLoop と、HTTPS 要求のためのデフォルトのイベント ループ。残念ながら、ProactorEventLoop は HTTPS コマンドでは機能しません。
次のコードは、新しく作成したデフォルトのイベント ループを使用し、Windows で最後にそれを閉じようとするとどうなるかを示しています。loop.close
以下に示すように最後に呼び出すと、最後に例外が発生します。
> Traceback (most recent call last):
> File "C:\BuildUtilities\p3.4env0\lib\site-packages\aiohttp\connector.py", line 56, in __del__
> self.close()
> File "C:\BuildUtilities\p3.4env0\lib\site-packages\aiohttp\connector.py", line 97, in close
> transport.close()
> File "C:\Python34\Lib\asyncio\selector_events.py", line 375, in close
> self._loop.remove_reader(self._sock_fd)
> File "C:\Python34\Lib\asyncio\selector_events.py", line 155, in remove_reader
> key = self._selector.get_key(fd)
> AttributeError: 'NoneType' object has no attribute 'get_key'
コメントアウトすると例外が削除されますが、その理由はわかりません。唯一無二
import asyncio
import aiohttp
@asyncio.coroutine
def get_body(url):
response = yield from aiohttp.request('GET', url)
return (yield from response.read_and_close())
#loop = asyncio.ProactorEventLoop()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
f = asyncio.async( get_body('https://www.google.com') )
try:
loop.run_until_complete(f)
except Exception as e:
print(e)
if f.result():
print(f.result())
loop.close()
ありがとう、グリーンアージ