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

树莓派中多无限循环函数无法协同运行问题求助

问题根源

你遇到的核心问题是两个函数都是阻塞式运行的——比如controller()里大概率有一个持续监听手柄输入的死循环,一旦进入这个函数,程序就会卡在里面无法向下执行,自然没法启动后面的sensor();调换调用顺序后,sensor()的死循环也会阻塞后续的controller()。要实现同时工作,必须让两个任务并行执行。

两种可行解决方案

方法1:多线程并行执行

用Python的threading模块把两个函数放到独立线程中,让它们同时运行:

import threading
import time

# 超声波测距函数(保留死循环,持续运行)
def sensor():
    while True:
        # 替换成你的测距逻辑
        distance = get_ultrasonic_distance()
        print(f"当前距离: {distance} cm")
        time.sleep(0.1)  # 控制测距频率,避免占用过多资源

# PS4手柄控制函数(保留死循环,持续监听)
def controller():
    # 替换成你的手柄初始化逻辑
    init_ps4_controller()
    while True:
        # 获取手柄输入并控制电机
        input_state = read_controller_input()
        control_motors(input_state)
        time.sleep(0.05)  # 控制手柄响应频率

# 主程序入口
if __name__ == "__main__":
    # 创建线程
    sensor_thread = threading.Thread(target=sensor)
    controller_thread = threading.Thread(target=controller)
    
    # 设置守护线程:主程序退出时线程自动终止
    sensor_thread.daemon = True
    controller_thread.daemon = True
    
    # 启动线程
    sensor_thread.start()
    controller_thread.start()
    
    # 让主程序保持运行(否则主进程结束会带走所有线程)
    while True:
        time.sleep(1)
  • 注意:如果两个函数需要共享资源(比如电机控制的状态变量),要使用threading.Lock()加锁,避免多线程竞争导致的逻辑混乱。

方法2:单循环轮询任务

如果不想用多线程,可以重构代码,把两个任务的单次执行逻辑放到同一个主循环中交替运行:

import time

# 单次测距逻辑(去掉死循环,只执行一次测距)
def get_distance_once():
    # 替换成你的单次测距代码
    return calculated_distance

# 单次手柄控制逻辑(去掉死循环,只处理一次输入)
def handle_controller_once():
    input_state = read_controller_input()
    control_motors(input_state)

# 主循环
if __name__ == "__main__":
    init_ps4_controller()  # 初始化手柄
    while True:
        handle_controller_once()
        distance = get_distance_once()
        print(f"当前距离: {distance} cm")
        time.sleep(0.05)  # 控制循环整体频率
  • 这种方式无需处理线程同步问题,但要注意把原函数中的死循环移除,改成单次执行的逻辑,依赖主循环反复调用实现持续运行。
选择建议
  • 如果两个任务的执行频率差异较大(比如测距每秒10次,手柄控制每秒20次),多线程方案更灵活;
  • 如果逻辑简单、没有共享资源竞争,单循环轮询的代码更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:22:40