You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修复说明

  1. 替换异步HTTP库:用 aiohttp 替代 requests,彻底解决同步请求阻塞异步事件循环的问题,这是修复程序假死的核心。
  2. 添加全局异常捕获:捕获请求过程中所有可能的异常(网络超时、连接失败、数据格式错误等),确保程序不会因单次异常直接挂起。
  3. 完善边界检查:对字符串切片、列表索引、类型转换都增加了判断,避免因非预期数据格式导致程序崩溃。
  4. 规范资源管理:用 with 上下文管理器自动管理HTTP会话和响应资源,避免连接泄漏。
  5. 补全逻辑缺失:添加了响应状态码判断,修复了原代码中孤立的 else: 语法问题。

额外建议

  • 尽量避免使用 global 变量,优先通过函数参数传递数据,减少全局状态引发的潜在bug。
  • 可添加请求重试机制(如临时网络错误时自动重试1-2次),提升程序稳定性。
  • 用 logging 模块替代 print 输出日志,方便后续问题排查。

内容的提问来源于stack exchange,提问作者Advaita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:15:40