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

Windows下Pyftdi调用multiprocessing多进程时USB接口占用报错求助

Windows环境Pyftdi控制FT232H多进程冲突解决方法

问题复现与根因

环境配置:Windows系统,Pyftdi驱动Adafruit FT232H Breakout开发板,驱动为ZADIG安装的libusbK 3.0.7版本,单进程下所有功能运行正常,引入multiprocessing模块后触发报错。
复现代码:

import multiprocessing as mp

import board

def func():
    print('This will crash')

p1 =  mp.Process(target=func)

p1.start()
p1.join()
p1.terminate

触发错误信息:

pyftdi.ftdi.FtdiError: UsbError: [Errno None] b'libusb0-dll:err [claim_interface] could not claim interface 0, win error: Cannot create a file when that file already exists.

核心原因:Windows下Python multiprocessing默认使用spawn模式创建新进程,会重新全量导入依赖模块,子进程导入board模块时会尝试声明已经被主进程占用的USB接口,直接抛出占用错误;如果强行跳过子进程的board模块导入,子进程没有完成设备上下文初始化,所有FT232H相关指令都无法正常执行。

可行解决思路

  • 方案1:单进程独占硬件,跨进程做消息通信(稳定性最高,优先推荐)
    不要在主进程或其他业务进程中导入board、初始化Pyftdi设备,单独启动一个常驻的专属硬件控制进程,所有FT232H相关的硬件操作全部放在这个进程内执行。其余业务进程和硬件进程之间通过multiprocessing.Queue、Pipe或者Manager传递操作指令、交互数据。
    该方案从根源上避免了多进程同时尝试占用USB接口的问题,不需要修改驱动、Pyftdi底层逻辑。注意:硬件进程必须在退出逻辑中显式调用设备close()方法释放资源,避免设备被残留占用需要物理拔插恢复。
  • 方案2:多进程分时复用设备,显式释放/重连设备
    如果业务逻辑要求必须在多个进程中直接操作硬件,需要严格做设备占用的时序控制:创建子进程前,主进程先调用Pyftdi设备实例的close()方法,完全释放已占用的USB接口,同时创建Process对象时传入inherit_handles=False参数,阻止子进程继承父进程的USB设备句柄,避免句柄残留导致的占用。子进程启动后自行完成board导入、设备初始化操作,子进程退出时同样显式调用close()释放接口,主进程需要操作硬件时再重新建立连接即可。
  • 方案3:切换进程启动方式(仅WSL环境可用,原生Windows不支持)
    可以在所有模块导入之前执行mp.set_start_method('fork'),复用父进程的内存上下文避免重复导入模块触发设备重连,但Windows原生系统不支持fork启动模式,该方案仅适用于在WSL2环境下运行代码的场景,原生Windows环境调用会直接抛出异常,不推荐使用。

避坑提示

不要尝试将主进程中初始化好的Pyftdi、board实例直接作为参数传递给子进程使用,USB设备句柄属于内核态资源,跨进程传递的句柄在Windows下无访问权限,会直接触发操作失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:54:32