Python异步请求发送数次后无响应停止运行问题求助
问题排查和修复方案
先直接说你代码里导致程序假死的几个关键问题:
- 无异常捕获机制:
requests.get()一旦遇到超时、连接失败或返回错误状态码,会直接阻塞程序,既不报错也不会继续执行后续逻辑。 - 语法逻辑错误:代码里存在孤立的
else:语句,没有对应的if条件判断,这本身就会导致语法问题,推测你粘贴时遗漏了响应状态判断的代码。 - 同步请求阻塞异步循环:
requests是同步HTTP库,在异步函数中调用它会直接阻塞整个事件循环,多次请求后极易引发程序假死。 - 资源释放不严谨:手动调用
r.close()不如用上下文管理器自动管理资源,容易因遗漏导致连接堆积。
修复后的代码示例
import asyncio import aiohttp # 替换为异步HTTP库,避免阻塞事件循环 async def get_data(): global data_list, stock_keys counter = 1 user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36' headers = {'Connection': 'close', 'User-Agent': user_agent} # 用异步会话复用连接池,减少连接开销 async with aiohttp.ClientSession(headers=headers) as session: while True: try: async with session.get(url) as r: # 先校验请求是否成功 if r.status == 200: counter += 1 print("请求次数: ", counter) main_txt = await r.text() # 异步读取响应内容 csvs = main_txt.split('@') # 防止切片后索引越界 if len(csvs) >= 3: main_csv = csvs[2] csv = main_csv.split(';') rows = [row.split(',') for row in csv] data_list.clear() for row in rows: # 检查列表长度,避免索引报错 if len(row) >= 23 and row[22] in stock_keys: # 防护类型转换异常 try: data_list.append([row[1]] + [float(row[7])]) except ValueError: print(f"数据转数字失败: {row[7]}") # 原代码中signal(data)应为signal(data_list),请自行核对 signal(data_list) else: print(f"请求失败,状态码: {r.status}") except Exception as e: # 捕获所有异常并打印,避免程序静默挂起 print(f"请求异常: {str(e)}") await asyncio.sleep(1)
关键修复说明
- 替换异步HTTP库:用
aiohttp替代requests,彻底解决同步请求阻塞异步事件循环的问题,这是修复程序假死的核心。 - 添加全局异常捕获:捕获请求过程中所有可能的异常(网络超时、连接失败、数据格式错误等),确保程序不会因单次异常直接挂起。
- 完善边界检查:对字符串切片、列表索引、类型转换都增加了判断,避免因非预期数据格式导致程序崩溃。
- 规范资源管理:用
with上下文管理器自动管理HTTP会话和响应资源,避免连接泄漏。 - 补全逻辑缺失:添加了响应状态码判断,修复了原代码中孤立的
else:语法问题。
额外建议
- 尽量避免使用
global变量,优先通过函数参数传递数据,减少全局状态引发的潜在bug。 - 可添加请求重试机制(如临时网络错误时自动重试1-2次),提升程序稳定性。
- 用
logging模块替代print输出日志,方便后续问题排查。
内容的提问来源于stack exchange,提问作者Advaita
相关产品推荐
相关产品推荐

