移除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)
方案说明
- 定时调度逻辑:每次
get_currency执行完毕后,通过threading.Timer调度30秒后再次执行自身,实现无while True的循环更新。 - 线程安全:加入
threading.Lock确保多线程对result的读写操作不会出现数据不一致问题,简单赋值场景可省略锁,但复杂操作必须添加。 - 可控性:相比
while True,Timer方式可以更灵活地控制任务的启停(比如通过全局标志位终止调度)。
内容的提问来源于stack exchange,提问作者iprahka
相关产品推荐
相关产品推荐

