树莓派中多无限循环函数无法协同运行问题求助
问题根源
你遇到的核心问题是两个函数都是阻塞式运行的——比如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
相关产品推荐
相关产品推荐

