Win11下Python3.10.5运行asyncio+aiohttp代码报WinError995求助
本地Win11下asyncio+aiohttp请求出现WinError 995错误的解决办法
我用asyncio和aiohttp写的异步请求代码,在云服务器上正常运行,但在本地Win11(Python3.10.5)上跑时出现OSError: [WinError 995]错误。已经重装过Python和依赖库,没找到解决办法,求帮忙。
代码示例
import asyncio import aiohttp import time async def get_tasks(session): tasks = [] for page in range(1, 10): url = "https://www.google.com/search?q=" + str(page) header = {'User-Agent': 'Mozilla/5.0'} task = asyncio.create_task(session.get(url, headers=header)) tasks.append(task) results = await asyncio.gather(*tasks) return results async def main(): async with aiohttp.ClientSession() as session: responses = await get_tasks(session) for response in responses: await response.text() if __name__ == "__main__": start_time = time.time() asyncio.run(main()) print("--- %s seconds ---" % (time.time() - start_time))
报错信息
Traceback (most recent call last): File "c:\Users\Mohamed Anan\GitHub\Web-Scraping\anan\async.py", line 25, in <module> asyncio.run(main()) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\runners.py", line 44, in run return loop.run_until_complete(main) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 646, in run_until_complete return future.result() File "c:\Users\Mohamed Anan\GitHub\Web-Scraping\anan\async.py", line 19, in main responses = await get_tasks(session) File "c:\Users\Mohamed Anan\GitHub\Web-Scraping\anan\async.py", line 13, in get_tasks results = await asyncio.gather(*tasks) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\client.py", line 1122, in send return self._coro.send(arg) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\client.py", line 535, in _request conn = await self._connector.connect( File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\connector.py", line 542, in connect proto = await self._create_connection(req, traces, timeout) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\connector.py", line 907, in _create_connection _, proto = await self._create_direct_connection(req, traces, timeout) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\connector.py", line 1175, in _create_direct_connection transp, proto = await self._wrap_create_connection( File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\site-packages\aiohttp\connector.py", line 986, in _wrap_create_connection return await self._loop.create_connection(*args, **kwargs) # type: ignore[return-value] # noqa File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 1049, in create_connection sock = await self._connect_sock( File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\base_events.py", line 960, in _connect_sock await self.sock_connect(sock, address) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\proactor_events.py", line 709, in sock_connect return await self._proactor.connect(sock, address) RuntimeError: await wasn't used with future _OverlappedFuture exception was never retrieved future: <_OverlappedFuture finished exception=OSError(22, 'The I/O operation has been aborted because of either a thread exit or an application request', None, 995, None)> Traceback (most recent call last): File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 817, in _poll value = callback(transferred, key, ov) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 604, in finish_connect ov.getresult() OSError: [WinError 995] The I/O operation has been aborted because of either a thread exit or an application request _OverlappedFuture exception was never retrieved future: <_OverlappedFuture finished exception=OSError(22, 'The I/O operation has been aborted because of either a thread exit or an application request', None, 995, None)> Traceback (most recent call last): File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 817, in _poll value = callback(transferred, key, ov) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 604, in finish_connect ov.getresult() OSError: [WinError 995] The I/O operation has been aborted because of either a thread exit or an application request _OverlappedFuture exception was never retrieved future: <_OverlappedFuture finished exception=OSError(22, 'The I/O operation has been aborted because of either a thread exit or an application request', None, 995, None)> Traceback (most recent call last): File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 817, in _poll value = callback(transferred, key, ov) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 604, in finish_connect ov.getresult() OSError: [WinError 995] The I/O operation has been aborted because of either a thread exit or an application request _OverlappedFuture exception was never retrieved future: <_OverlappedFuture finished exception=OSError(22, 'The I/O operation has been aborted because of either a thread exit or an application request', None, 995, None)> Traceback (most recent call last): File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 817, in _poll value = callback(transferred, key, ov) File "C:\Users\Mohamed Anan\AppData\Local\Programs\Python\Python310\lib\asyncio\windows_events.py", line 604, in finish_connect ov.getresult() OSError: [WinError 995] The I/O operation has been aborted because of either a thread exit or an application request
解决办法
1. 切换asyncio事件循环策略
Windows默认的ProactorEventLoop在处理并发连接时容易触发I/O错误,切换回SelectorEventLoop即可解决。在代码开头添加:
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
修改后的完整代码:
import asyncio import aiohttp import time # 切换事件循环策略 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) async def get_tasks(session): tasks = [] for page in range(1, 10): url = "https://www.google.com/search?q=" + str(page) header = {'User-Agent': 'Mozilla/5.0'} task = asyncio.create_task(session.get(url, headers=header)) tasks.append(task) # 添加return_exceptions避免单个请求失败导致整体崩溃 results = await asyncio.gather(*tasks, return_exceptions=True) return results async def main(): async with aiohttp.ClientSession() as session: responses = await get_tasks(session) for response in responses: if isinstance(response, Exception): print(f"请求失败: {response}") continue await response.text() if __name__ == "__main__": start_time = time.time() asyncio.run(main()) print("--- %s seconds ---" % (time.time() - start_time))
2. 限制并发连接数
Windows系统网络资源限制更严格,aiohttp默认并发数可能过高,创建ClientSession时指定连接池大小:
async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(limit=5)) as session:
3. 检查本地网络环境
Win11本地的代理、防火墙或杀毒软件可能拦截异步请求,可暂时关闭这类软件测试;同时确认目标域名(比如谷歌)能正常访问。
内容的提问来源于stack exchange,提问作者Anan
相关产品推荐
相关产品推荐

