我尝试用multiprocessing
sPool
通过 Python 运行一些任务。一切似乎都正常工作,但有一行代码让 Python 意外退出,它是计算矩阵逆矩阵的那一行。( scipy.linalg.inv()
)
苹果错误日志打印
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000108
我很确定,它与逆有关,而不是与一些未知变量有关,因为如果我只计算,退出也会发生:
la.inv(np.eye(n))
我认为这可能与la.inv()
使用多个线程的事实有关。
注意:如果我在没有并行化的情况下运行代码,它当然可以工作。 如果我只是评论上面的行,它也可以工作。
但是,如果我运行一些测试代码,可以最大限度地减少问题:
import numpy as np
import scipy.linalg as la
from multiprocessing import Pool
class ParClass(object):
def __init__(self):
super(ParClass, self).__init__()
def compute(self,x):
self.x = la.inv(np.random.randn(1000,1000))
return self
def runPar(x):
method = ParClassifier()
method.compute(x)
return method.x
if __name__ == '__main__':
pool = Pool(processes=4)
result = pool.map(runPar, np.arange(1,100))
错误不会发生。那么为什么影响我原来问题打洞过程的一行代码,却不影响一个测试问题呢?这很奇怪,但是以前有人遇到过吗?
编辑:
np.linalg.solve()
没有做得更好