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

Python如何在for/while循环中使用threading及解决相关报错?

问题排查与解决步骤

第一步:定位报错根源

  • 错误本质是代码某处执行了变量 - relativedelta的减法运算,而参与运算的变量是None值,该报错和多线程启动逻辑本身没有直接语法关联,问题出在线程执行的目标函数stopping_volume内部。
  • 你可以先剥离多线程和while循环逻辑,单独调用一次stopping_volume(usdtLists[0], 0),复现错误后就能定位到具体是哪一行代码做了时间减法运算,检查该行的变量为什么会返回空值。

第二步:排查多线程场景下的空值诱因

你当前的多线程写法存在两个典型问题,大概率是引发空值的直接原因:

  • 线程未做生命周期管理,同时while死循环无间隔,会短时间内启动大量线程,导致公共资源(比如获取时间、获取币种行情的接口、公共变量)被并发调用超限,返回None值
    原来的写法相当于每秒会启动上百个线程,很容易触发行情接口限流、或者公共变量被并发修改覆盖成None。修改方案是控制并发数量,每轮循环的线程全部执行完成后再进入下一轮:
import time
from threading import Thread

while True:
    thread_list = []
    for i in range(len(usdtLists)):
        t = Thread(target=stopping_volume, args=(usdtLists[i], i))
        t.start()
        thread_list.append(t)
    # 等待本轮所有线程执行完成
    for t in thread_list:
        t.join()
    # 按需添加间隔,避免请求过于频繁
    time.sleep(1)
  • 没有异常捕获逻辑,stopping_volume函数内部调用的接口、读取的变量如果出现异常会直接返回None,后续运算就会触发该报错。你可以在stopping_volume函数的时间运算逻辑前加空值判断,也可以给函数加全局异常捕获:
def stopping_volume(coin_list, idx):
    try:
        # 原有函数逻辑写在这里
        # 时间运算前先判断变量是否为None
        if target_time is None:
            print(f"第{idx}组币种列表获取时间为空,跳过运算")
            return
        # 后续的时间减法逻辑写在空值判断之后
    except Exception as e:
        print(f"第{idx}组任务执行出错:{e}")

第三步:验证修复效果

  • 先单线程测试所有stopping_volume的入参,确认没有空值的情况下不会报错
  • 再替换成调整后的多线程控制逻辑,确认不会因为并发过高引发接口返回空值

内容的提问来源于stack exchange,提问作者Mr. AMI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:48:04