Python树莓派项目:如何实现非阻塞单线程循环执行函数?
解决Python线程重复创建导致的性能问题
嘿,这个问题我之前在树莓派项目里也踩过坑!你现在的核心问题是主线程一直在无节制地创建新线程,而不是复用单个线程来反复执行目标函数。咱们换个思路,让工作线程自己内部做循环,这样既保证只有一个额外线程在运行,主线程也能完全不受干扰地执行自己的逻辑。
核心解决方案:让线程内部持续循环
不要让主线程负责反复创建线程,而是定义一个包装函数,让线程启动后在这个函数里持续调用myFunc,直到你主动停止它。
示例代码如下:
import threading import time def myFunc(): # 这里替换成你实际的业务逻辑,比如传感器读取、硬件控制等 print("Executing myFunc...") time.sleep(1) # 模拟函数执行耗时,根据你的需求调整 def thread_worker(): # 工作线程内部循环,反复执行myFunc while True: myFunc() # 如果需要,可以加个短间隔避免过度占用CPU,可选 # time.sleep(0.05) # 启动单个工作线程 worker_thread = threading.Thread(target=thread_worker) worker_thread.daemon = True # 设置为守护线程:主线程退出时自动终止工作线程 worker_thread.start() # 主线程的逻辑完全不受影响,正常执行 while True: print("Hello World") time.sleep(0.5)
为什么这个方案有效?
- 始终只有1个额外线程在运行,不会出现线程数量爆炸的情况,系统资源占用稳定。
- 工作线程执行完
myFunc后会立刻进入下一次循环,完全符合你“执行完立即再次运行”的需求。 - 主线程的
print("Hello World")完全独立,不会被工作线程的执行阻塞,两者并行运行。
进阶:优雅停止线程(可选)
如果你的程序需要优雅退出(比如捕获Ctrl+C),可以用threading.Event来控制循环,避免强制杀死线程带来的资源泄漏:
import threading import time # 创建一个事件用于控制线程停止 stop_signal = threading.Event() def myFunc(): print("Executing myFunc...") time.sleep(1) def thread_worker(): # 只要停止信号未触发,就持续执行myFunc while not stop_signal.is_set(): myFunc() worker_thread = threading.Thread(target=thread_worker) worker_thread.daemon = True worker_thread.start() try: # 主线程正常运行逻辑 while True: print("Hello World") time.sleep(0.5) except KeyboardInterrupt: # 捕获Ctrl+C,发送停止信号 stop_signal.set() worker_thread.join() # 等待工作线程优雅结束 print("Worker thread stopped. Exiting program...")
对比你原来的两种方式
- 第一种无限创建线程的方式:线程数量持续增长,操作系统需要不断调度大量线程,导致程序变慢甚至崩溃。
- 第二种用
join()的阻塞方式:主线程必须等待工作线程结束才能继续,完全失去了线程并行的意义。
而上面的内部循环方案完美解决了这两个问题,既保证了线程的复用,又让主线程和工作线程并行运行。
内容的提问来源于stack exchange,提问作者embedded.95
相关产品推荐
相关产品推荐

