Asyncioとaiohttpライブラリを使用してたくさんのリクエスト(〜1000)を作成しようとしていますが、私は多くの情報を見つけることができないという問題に遭遇しています。Asyncio RuntimeError:イベントループが終了しました
このコードを10個のURLで実行すると、正常に動作します。私は100 + URLでそれを実行すると、それは壊れて、私にRuntimeError: Event loop is closed
エラーを与える。
import asyncio
import aiohttp
@asyncio.coroutine
def get_status(url):
code = '000'
try:
res = yield from asyncio.wait_for(aiohttp.request('GET', url), 4)
code = res.status
res.close()
except Exception as e:
print(e)
print(code)
if __name__ == "__main__":
urls = ['https://google.com/'] * 100
coros = [asyncio.Task(get_status(url)) for url in urls]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coros))
loop.close()
スタックトレースはhereです。
私はこれ以上数時間頭を叩いていたので、助けや洞察力があれば幸いです。明らかに、これはまだ開いているはずのイベントループがクローズされていることを示唆していますが、その可能性はわかりません。
を行ってください 'Asyncio'エラーではありません。 Pythonの再帰的なエラー、限界に達しました。すべての非クラス関数のスレッドが必要です。 – dsgdfg
まず、最新のaiohttpリリースを使用していることを確認してください。 私はあなたと思っています。 技術的には、基本的なソケットを閉じるための要求を終えた後、ループの繰り返しが1回必要です。 'loop.close()'の前に 'loop.run_until_complete(asyncio.sleep(0))'を挿入してください。 –
あなたのトレースバックは、[Executor](https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor)から[run_in_executor](https:// docs .python.org/3/library/asyncio-eventloop.html#asyncio.BaseEventLoop.run_in_executor)がループが閉じられた後に返されました。奇妙なことに、[aiohttp](https://github.com/KeepSafe/aiohttp/search?utf8=%E2%9C%93&q=run_in_executor&type=Code)と[asyncio](https://github.com/python/asyncio)/search?utf8 =%E2%9C%93&q = run_in_executor) 'run_in_executor'を使用しないでください... – Vincent