[未解決問題記錄]python asyncio+aiohttp出現Exception ignored:RuntimeError('Event loop is closed')


找了半天沒找到原因,記錄一下

操作系統:windows 8.1

python版本:python 3.8.1

aiohttp版本:3.6.2

源碼:

 1 import asyncio
 2 import aiohttp
 3 
 4 
 5 async def aiohttp_request_test(url):
 6     async with aiohttp.request('get', url=url) as resp:
 7         await resp.text()
 8         # await asyncio.sleep(1) # A1
 9 
10 
11 async def main():
12     await asyncio.gather(aiohttp_request_test('https://www.baidu.com'))
13 
14 
15 asyncio.run(main())
16 # loop = asyncio.get_event_loop()
17 # loop.run_until_complete(main())

運行以上代碼時,出現如下異常:

Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x02A8C8E0>
Traceback (most recent call last):
  File "D:\Python\Anaconda3\envs\python38\lib\asyncio\proactor_events.py", line 116, in __del__
    self.close()
  File "D:\Python\Anaconda3\envs\python38\lib\asyncio\proactor_events.py", line 108, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "D:\Python\Anaconda3\envs\python38\lib\asyncio\base_events.py", line 715, in call_soon
    self._check_closed()
  File "D:\Python\Anaconda3\envs\python38\lib\asyncio\base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

但是在第8行處加上一句await asyncio.sleep(1)后,無異常(方案A

或者將

asyncio.run(main())

改為:

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

也無異常。(方案B

(實際使用的時候方案B也會出現上述異常,但這里未能復現,且也可用方案A解決)

我就很奇怪為什么加上一句await asyncio.sleep(1)就不報錯了

還有,如果request拋出了一個異常並被捕獲的話(將aiohttp_request_test改為如下):

async def aiohttp_request_test(url):
    try:
        async with aiohttp.request('get', url=url) as resp:
            await resp.text()
    except:
        pass

則也不會報RuntimeError: Event loop is closed

 

困了,找到原因了再回來補充。

-----------------------------------------------------------分割線-----------------------------------------------------------

在aiohttp官方文檔找到一個疑似的原因:https://docs.aiohttp.org/en/latest/client_advanced.html#graceful-shutdown


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM