为何API数据处理逻辑中if语句内的while循环无限运行?
解决API数据处理中while循环无限运行及重复插入问题
业务需求
- 每15分钟从API拉取数据,处理逻辑如下:
- 当
MoreUpdates为true且items数组有数据:单批处理上限100条,处理完当前批次后立即请求下一批数据 - 当
MoreUpdates为false且items数组有数据:待处理数据≤100条,处理完成后等待下一次定时请求 - 当
MoreUpdates为false且items数组无数据:无更新需处理,等待下一次定时请求
- 当
遇到的问题
使用while循环时出现无限运行,且重复插入相同数据,无法处理后续待更新数据。原代码片段如下:
def process(): data=get_data() more_updates=data["Update"]["MoreUpdates"] items=data["Update"]["Items"] now=datetime.now() try: get_data() if more_updates is True: while more_updates is True: insert_data() print(f"data inserted at {now}, items_updated: {len(items)}, more_updates: {more_updates}") send_teams_message("data successfully inserted in DB") get_data() else: if len(items)>0 and len(items)<=100: insert_data() print(f"data inserted at {now}, items_updated: {len(items)}, more_updates: {more_updates}") send_teams_message("data successfully inserted in DB") else: print(f"no updates at {now}, items_updated: {len(items)}, more_updates: {more_updates}") send_teams_message("No updates in DB") except: send_teams_message("Exception, data not inserted in DB") interval(process,15)
EDIT2代码片段:
def process(): data=get_data() more_updates=data["Update"]["MoreUpdates"] items=data["Update"]["Items"] now=datetime.now() try: get_data() if more_updates is True: while more_updates: insert_data() print() send_teams_message() get_data() data=get_data() more_updates=data["Update"]["MoreUpdates"]
错误原因
- 重复插入相同数据:拉取新数据后未更新
items变量,insert_data()始终使用初始拉取的旧数据 - 无限循环:
- 第一个版本中,进入while循环后未重新获取
more_updates的最新值,导致循环条件始终为True无法终止 - 第二个版本虽更新了
more_updates,但仍未更新items,且重复调用get_data()可能造成数据遗漏或重复拉取
- 第一个版本中,进入while循环后未重新获取
修正后的代码
import datetime # 假设interval、get_data、insert_data、send_teams_message为已实现的函数 def process(): now = datetime.datetime.now() try: # 初始拉取数据 data = get_data() more_updates = data["Update"]["MoreUpdates"] items = data["Update"]["Items"] # 处理多批次数据 while more_updates and len(items) > 0: # 单批最多处理100条 batch_items = items[:100] insert_data(batch_items) # 修改insert_data接收当前批次数据 print(f"data inserted at {now}, items_updated: {len(batch_items)}, more_updates: {more_updates}") send_teams_message("data successfully inserted in DB") # 拉取下一批数据并更新状态 data = get_data() more_updates = data["Update"]["MoreUpdates"] items = data["Update"]["Items"] # 处理剩余的单批次数据 if len(items) > 0: insert_data(items) print(f"data inserted at {now}, items_updated: {len(items)}, more_updates: {more_updates}") send_teams_message("data successfully inserted in DB") else: print(f"no updates at {now}, items_updated: {len(items)}, more_updates: {more_updates}") send_teams_message("No updates in DB") except Exception as e: # 捕获具体异常便于排查 print(f"Exception occurred: {str(e)}") send_teams_message(f"Exception, data not inserted in DB: {str(e)}") interval(process, 15)
关键修正说明
- 同步数据变量:每次循环拉取新数据后,同步更新
more_updates和items,确保处理最新批次数据 - 批次上限控制:通过
items[:100]截取单批最多100条数据,符合业务要求 - 优化循环条件:循环条件改为
more_updates and len(items) > 0,避免无数据时进入循环 - 异常处理优化:捕获具体异常并打印信息,便于定位问题
- 移除冗余调用:删除重复的
get_data()调用,减少不必要的API请求
内容的提问来源于stack exchange,提问作者user19441790
相关产品推荐
相关产品推荐

