Mac M1环境下单独线程运行np.linalg.solve触发Bus Error的原因
问题描述
环境配置
- numpy: 1.6.2
- OS: macOS Monterey 12.2.1 (M1)
- Python 3.10(虚拟环境)
问题现象
用PySide开发GUI程序时,为避免界面阻塞,将耗时的numpy计算放到单独线程运行,触发bus error,错误信息如下:
[1] 38918 bus error python3 app.py
不使用线程时代码运行完全正常,经排查错误由np.linalg.solve(A, B)触发。
代码示例
import sys from PySide6.QtWidgets import QApplication, QMainWindow from PySide6.QtCore import Slot, QThreadPool, QThread, QObject, Signal, QMetaObject import numpy as np from algorithm import main from test_ui import Ui_MainWindow class Worker(QObject): finished = Signal(int) progress = Signal(tuple) def __init__(self): super(Worker, self).__init__() def run(self): np.linalg.solve(np.array([[0, 1], [1, 2]]), np.array([[2,3], [3,4]])) print("a") self.finished.emit(1) class Window(QMainWindow): def __init__(self): super(Window, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) self.ui.pushButton.clicked.connect(self.run_ht) self.thread = None self.worker = None self.buildWorker() def run_ht(self): self.thread.start() def buildWorker(self): thread = QThread() worker = Worker() worker.moveToThread(thread) thread.started.connect(worker.run) worker.finished.connect(thread.quit) QMetaObject.connectSlotsByName(self) self.thread = thread self.worker = worker app = QApplication(sys.argv) window = Window() window.show() app.exec()
解决方案
核心原因
numpy 1.6.2是2013年发布的老旧版本,完全没有针对Apple Silicon(M1)架构做适配。在M1 Mac的多线程环境下,老版本numpy的线性代数模块(依赖底层BLAS/LAPACK库)会出现内存访问错误,也就是触发bus error。
修复步骤
升级numpy版本
卸载旧版本numpy,安装适配M1架构的新版本:pip uninstall numpy -y pip install numpy>=1.21.0注:numpy 1.21.0及以上版本开始正式支持Apple Silicon,可彻底解决多线程下的架构兼容问题。
临时规避方案(不推荐)
如果暂时无法升级numpy,可以尝试用QThreadPool+QRunnable替代QThread实现,不过这只是临时 workaround,核心问题仍需通过版本升级解决:from PySide6.QtCore import QRunnable, QThreadPool class SolveRunnable(QRunnable): def run(self): np.linalg.solve(np.array([[0, 1], [1, 2]]), np.array([[2,3], [3,4]])) print("a") # 修改Window类中的run_ht方法 def run_ht(self): pool = QThreadPool.globalInstance() runnable = SolveRunnable() pool.start(runnable)
内容的提问来源于stack exchange,提问作者user14028806
相关产品推荐
相关产品推荐

