3

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()

ありがとう、グリーンアージ

4

3 に答える 3

1

実際には、Python 3.4 自体の (修正された) バグです: http://bugs.python.org/issue21435

一時的な解決策として (そして Python 3.3 のサポートのために) プル リクエストを作成しましたhttps://github.com/KeepSafe/aiohttp/pull/48

しかし、繰り返しますが、問題の根本は Python 3.4.0 のガベージ コレクターです (次の Python 3.4.1 バグ修正リリースで修正されます)。

于 2014-05-13T20:00:05.950 に答える