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

移除While True后requests获取汇率不更新的问题求助

问题原因分析
  • 带while True的get_currency函数:在子线程中持续循环执行,每30秒重新请求汇率并更新全局变量result,因此MyBot线程能持续获取到最新汇率值。
  • 移除while True后:get_currency仅执行一次,子线程完成单次请求后就终止,后续不再发起新的汇率请求,result不再更新,MyBot只能读到第一次请求后的固定值。
替代While True的解决方案

使用Python标准库的threading.Timer实现定时重复执行,无需手动写while True循环,代码更优雅可控:

import time
import threading
import requests

result = 0
# 线程锁:处理复杂读写操作时保证线程安全,简单赋值场景可省略
lock = threading.Lock()

def get_currency():
    global result
    try:
        # 替换为实际的汇率API请求逻辑
        resp = requests.get("https://api.exchangerate-api.com/v4/latest/USD")
        new_rate = resp.json()["rates"]["CNY"]
        # 加锁更新,避免多线程冲突
        with lock:
            result = new_rate
        print(f"已更新汇率:{result}")
    except Exception as e:
        print(f"汇率请求失败:{str(e)}")
    finally:
        # 30秒后再次调度执行自身,实现定时循环
        threading.Timer(30, get_currency).start()

def MyBot():
    while True:
        # 加锁读取,确保拿到完整的更新值
        with lock:
            current_rate = result
        print(f"Bot当前获取的汇率:{current_rate}")
        time.sleep(1)  # 控制Bot打印频率,按需调整

if __name__ == "__main__":
    # 启动汇率更新线程
    threading.Thread(target=get_currency, daemon=True).start()
    # 启动Bot线程
    threading.Thread(target=MyBot, daemon=True).start()
    
    # 主线程保持存活,避免子线程随主线程退出
    while True:
        time.sleep(1)

方案说明

  1. 定时调度逻辑:每次get_currency执行完毕后,通过threading.Timer调度30秒后再次执行自身,实现无while True的循环更新。
  2. 线程安全:加入threading.Lock确保多线程对result的读写操作不会出现数据不一致问题,简单赋值场景可省略锁,但复杂操作必须添加。
  3. 可控性:相比while True,Timer方式可以更灵活地控制任务的启停(比如通过全局标志位终止调度)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:05:21