如何使用while循环检测Python方法运行状态并记录数据
需求说明
- 调用指定方法后启动循环,在目标方法运行期间持续采集数据
- 待目标方法执行完毕后,自动停止采集并返回采集到的数据集
问题根因
你写的两个版本代码报错/运行不符合预期的原因非常明确:
- 移除if判断的版本仅保存1行数据:
return data被写在了while循环体内部,第一次循环执行完append操作就直接触发return退出整个函数,循环根本不会进入第二次迭代,自然只能拿到1条数据。 - 带if判断的版本触发*code unreachable(代码不可达)*报错:
if False是恒不成立的判断条件,这个分支下的所有代码永远没有执行机会,属于无效代码;而且就算这个分支能正常触发,return data已经直接退出函数了,后面跟的break、print "9"本身也是永远运行不到的冗余代码,同样属于不可达代码。
正确实现方案
核心要解决的问题是找准循环退出的真实触发时机:不能写if False这种永远不触发的假条件,也不能在循环内部直接return,必须能真实检测到kickCall()的执行完成状态,再跳出循环返回数据。
分场景适配逻辑:
- 如果
kickCall()是同步阻塞方法:调用后会阻塞等待动作执行完才会运行后续代码,这种模式下没法在方法运行期间插入循环采样,需要把kickCall()改成异步运行,拿到对应的任务状态句柄。 - 如果
kickCall()是异步非阻塞方法:每次循环采样后判断任务是否执行完成,完成就跳出循环,最后在循环外部返回所有采集到的数据,同时要加合理的采样间隔避免循环占满CPU资源。
参考修正代码框架:
import time def recordData(memory_service): """ Record the data from ALMemory. Returns a matrix of values """ print "Recording data ..." data = [] # 根据实际采样精度需求调整间隔,单位:秒 SAMPLE_INTERVAL = 0.01 # 启动kick动作,拿到异步任务句柄(根据你实际使用的异步框架替换对应写法) kick_task = kickCall() # 只要kick动作未执行完成,就持续采样 while not kick_task.done(): line = [] for key in ALMEMORY_KEY_NAMES: value = memory_service.getData(key) line.append(value) data.append(line) # 控制采样频率 time.sleep(SAMPLE_INTERVAL) # 所有采样完成后再返回全量数据 return data
如果是基于NAO机器人的ALMemory、ALMotion接口开发,异步调用动作后替换对应的任务完成判断逻辑即可,核心原则不变:循环内只做采样和状态判断,不要提前return,不要写永远不成立的退出条件。
内容的提问来源于stack exchange,提问作者user19408396
相关产品推荐
相关产品推荐

