Python中如何仅暂停脚本指定部分逻辑而不影响其余代码运行
非阻塞式固定间隔采样实现方案
核心思路是放弃会阻塞整个线程的time.sleep(),改用时间戳判断或多线程的方式实现间隔触发,完全不影响循环内其他逻辑的运行。
方案1:单循环时间戳判断(轻量化首选)
不需要修改现有代码结构,仅需新增时间标记变量判断是否达到采样间隔,适合逻辑简单、对资源占用敏感的场景。
实现代码
import time import numpy as np # 初始化上一次采样的时间戳,采样间隔设为300ms last_sample_time = 0 SAMPLE_INTERVAL = 0.3 while True: # 原有第一部分逻辑不受任何影响 if condition is True: print(xvalues) time.sleep(0.3) # 第二部分间隔采样逻辑 if another_condition is True: current_time = time.time() # 仅当距离上次采样满300ms才执行目标逻辑 if current_time - last_sample_time >= SAMPLE_INTERVAL: # 此处写入生成G-code、发送给CNC、保存文件的逻辑 np.savetxt('Xvalues.txt', xvalues) # 更新最后一次采样时间 last_sample_time = current_time
方案优势
- 无额外依赖,代码改造成本极低
- 无全局阻塞,其余逻辑完全按原有节奏运行
- 间隔误差仅为单次循环的耗时,绝大多数工业控制场景足够适用
方案2:多线程分离采样逻辑(高精度/复杂逻辑首选)
将间隔采样的逻辑放到独立子线程中运行,子线程内的sleep只会阻塞自身,完全不会干扰主线程的其他业务逻辑。
实现代码
import threading import time import numpy as np # 共享的X坐标变量,由主线程更新、子线程读取 xvalues = None # 线程锁,避免多线程读写共享变量时出现脏数据 x_lock = threading.Lock() # 独立采样子线程逻辑 def sampling_task(): global xvalues while True: # 子线程内的sleep仅阻塞当前子线程 time.sleep(0.3) # 先判断触发条件是否满足 if not another_condition: continue # 加锁读取最新的X坐标 with x_lock: current_x = xvalues if current_x is not None: # 执行生成G-code、发送CNC、保存文件的逻辑 np.savetxt('Xvalues.txt', current_x) # 启动后台采样线程,daemon参数保证主线程退出时子线程自动关闭 threading.Thread(target=sampling_task, daemon=True).start() # 主线程原有逻辑完全不受子线程影响 while True: if condition is True: print(xvalues) time.sleep(0.3) # 主线程更新X坐标时加锁 with x_lock: xvalues = 摄像头检测返回的最新X坐标 # 其余所有业务逻辑正常运行
注意事项
- 所有读写共享变量
xvalues的位置都要加锁,避免数据异常 - 若采样逻辑包含IO操作(如串口发送G-code给CNC),用多线程可以完全避免IO阻塞影响主线程的摄像头检测逻辑
内容的提问来源于stack exchange,提问作者Ruggero
相关产品推荐
相关产品推荐

