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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:29:31