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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:57:27