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

如何在Windows和Mac上阻止系统中断以运行Python实时进程?

解决方案:Python实时控制设备的抖动优化(Windows/Mac)

核心思路

通过隔离CPU核心(让操作系统和其他进程默认不占用指定核心),再将Python实时任务进程绑定到该核心,避免系统中断抢占,把抖动控制在1ms范围内。


Windows平台实现步骤

1. 系统层面隔离核心

让Windows系统服务和普通进程默认不使用指定核心,需重启生效:

  • 以管理员身份打开命令提示符,执行:
    bcdedit /set numproc N-1
    bcdedit /set isolatecores X
    
    说明:
    • N是笔记本总核心数(比如8核就写7),让系统仅使用前N-1个核心
    • X是要隔离的核心编号(从0开始,比如8核选7),该核心仅留给实时任务

2. Python代码绑定到隔离核心

用multiprocessing创建独立进程,绑定到隔离核心,同时避免父进程资源干扰:

import multiprocessing
import ctypes
import time

# 调用Windows API设置进程亲和性
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

def set_core_affinity(core_mask):
    hProcess = kernel32.GetCurrentProcess()
    kernel32.SetProcessAffinityMask(hProcess, core_mask)

def real_time_task():
    # 绑定到第7个核心(掩码为1<<7=128,对应编号7的核心)
    set_core_affinity(128)
    while True:
        start = time.perf_counter()
        # 替换为你的设备脉冲发送代码
        send_pulse_to_devices()
        # 控制周期,确保单次任务耗时不超过1ms
        elapsed = time.perf_counter() - start
        if elapsed < 0.001:
            time.sleep(0.001 - elapsed)

def send_pulse_to_devices():
    # 实际设备操作逻辑
    pass

if __name__ == '__main__':
    # 用spawn模式创建进程,避免父进程GIL和资源干扰
    multiprocessing.set_start_method('spawn')
    rt_process = multiprocessing.Process(target=real_time_task)
    rt_process.start()
    rt_process.join()

3. 额外优化

  • 关闭Windows Defender实时保护、自动更新等后台进程
  • 在任务管理器中,将Python实时进程的优先级设为实时

Mac平台实现步骤

1. 系统层面隔离核心

通过启动参数限制系统使用的核心数,剩余核心留作实时任务:

  • 重启Mac,按住Command+R进入恢复模式
  • 打开终端执行:
    nvram boot-args="cpus=X"
    
    说明:X是留给系统使用的核心数(比如8核写7),剩下的1个核心自动隔离

2. Python代码绑定到隔离核心

用psutil库(需先安装pip install psutil)设置进程亲和性:

import multiprocessing
import psutil
import time

def real_time_task():
    proc = psutil.Process()
    # 绑定到最后一个核心(比如8核的第7个,索引从0开始)
    proc.cpu_affinity([7])
    while True:
        start = time.perf_counter()
        send_pulse_to_devices()
        elapsed = time.perf_counter() - start
        if elapsed < 0.001:
            time.sleep(0.001 - elapsed)

def send_pulse_to_devices():
    # 实际设备操作逻辑
    pass

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')
    rt_process = multiprocessing.Process(target=real_time_task)
    rt_process.start()
    rt_process.join()

3. 额外优化

  • 关闭Spotlight自动索引、Time Machine自动备份等后台服务
  • 用终端命令提升进程优先级:
    renice -20 <PID>
    
    (<PID>替换为你的Python实时进程ID)

关键注意事项

  • 隔离核心后,该核心仅能被实时进程使用,系统和其他进程不会抢占
  • 必须用spawn启动进程,避免父进程的GIL和资源干扰
  • 实时任务代码要精简,尽量避免同步IO操作(必要时用异步非阻塞方式)
  • 测试抖动时用time.perf_counter()(高精度计时器),不要用time.time()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:52:53