在Python3.8中,异常事件循环使用aiohttp和asyncio关闭
我使用asyncio和aiohttp进行并发请求。我最近将Python升级到了3.8.0版,我得到了一个在Python3.8中,异常事件循环使用aiohttp和asyncio关闭,python,async-await,aiohttp,python-asyncio,Python,Async Await,Aiohttp,Python Asyncio,我使用asyncio和aiohttp进行并发请求。我最近将Python升级到了3.8.0版,我得到了一个运行时错误:在程序运行后,事件循环关闭 import asyncio import aiohttp async def do_call(name, session): async with session.get('https://www.google.be') as response: await response.text() return 'ok
运行时错误:在程序运行后,事件循环关闭
import asyncio
import aiohttp
async def do_call(name, session):
async with session.get('https://www.google.be') as response:
await response.text()
return 'ok - {}'.format(name)
async def main():
async with aiohttp.ClientSession() as session:
tasks = [do_call(str(i), session) for i in range(0,4)]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
我确实从asyncio.gather()获得了一个有效的结果,但退出时会引发异常。
我想更改代码,使其不会出现异常
回溯如下:
Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x000001E9A92079D0>
Traceback (most recent call last):
File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\proactor_events.py", line 116, in __del__
self.close()
File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\proactor_events.py", line 108, in close
self._loop.call_soon(self._call_connection_lost, None)
File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 711, in call_soon
self._check_closed()
File "C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\base_events.py", line 504, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed`
中忽略的异常:
回溯(最近一次呼叫最后一次):
文件“C:\Users\Jonas\AppData\Local\Programs\Python38\lib\asyncio\proactor\u events.py”,第116行,在__
self.close()
文件“C:\Users\Jonas\AppData\Local\Programs\Python38\lib\asyncio\proactor\u events.py”,第108行,关闭
self.\u循环。尽快呼叫(self.\u呼叫\u连接\u丢失,无)
文件“C:\Users\Jonas\AppData\Local\Programs\Python38\lib\asyncio\base\u events.py”,第711行,即将调用
自我检查关闭()
文件“C:\Users\Jonas\AppData\Local\Programs\Python\Python38\lib\asyncio\base\u events.py”,第504行,在\u check\u closed中
raise RUNTIMERROR('事件循环已关闭')
RuntimeError:事件循环已关闭`
我认为这很可能是一个aiohttp错误。具体来说,我在他们的github上发现了这个问题:
我意识到这不一定对你有帮助,但也许你可以换回来,不再把头撞在墙上。你的代码很好 我认为这很可能是一个aiohttp错误。具体来说,我在他们的github上发现了这个问题:
我意识到这不一定对你有帮助,但也许你可以换回来,不再把头撞在墙上。你的代码很好 我解决了这个问题,在使用完my\u loop.close()之后,我没有调用它。以这种方式关闭事件循环会导致错误被抛出,即使在我获得了预期的所有响应之后也是如此。我解决了这个问题,在使用完my\u loop.close()
。以这种方式关闭事件循环会导致错误被抛出,即使在我获得了预期的所有响应之后。您可以发布运行时错误的完整回溯吗?这将是有益的:)你的例子运行我没有错误。是否有其他与此相关的代码可能导致此错误?@piratenijas,谢谢您的回复。完整的程序张贴在这个问题上。我已经添加了问题的回溯。您使用的是哪个版本的aiohttp?我让您的代码使用python=3.8.0和aiohttp=3.6。2@PirateNinjas我也在使用3.6.2,运行在Windows10上。您是否在程序结束时遇到异常?能否发布运行时错误的完整回溯?这将是有益的:)你的例子运行我没有错误。是否有其他与此相关的代码可能导致此错误?@piratenijas,谢谢您的回复。完整的程序张贴在这个问题上。我已经添加了问题的回溯。您使用的是哪个版本的aiohttp?我让您的代码使用python=3.8.0和aiohttp=3.6。2@PirateNinjas我也在使用3.6.2,运行在Windows10上。节目结束时是否有例外情况?+1用于问题链接:为我做了诀窍。+1用于问题链接:为我做了诀窍。不幸的是,我认为这不适用于上述问题。提问者使用了asyncio.run,而不是获取事件循环,事件循环将事件循环闭包到其行为中。也就是说,使用run时,您永远不会呼叫close,因此您无法利用您的答案。不幸的是,我认为这不适用于上述问题。提问者使用了asyncio.run,而不是获取事件循环,事件循环将事件循环闭包到其行为中。也就是说,使用run时,您永远不会呼叫close,因此您无法利用您的答案。