我尝试用Python运行multiprocessing
s Pool
的一些任务。所有似乎都应该工作,但是一行允许Python意外退出,它是行,它计算矩阵的逆矩阵。 (scipy.linalg.inv()
)
苹果错误日志打印
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000108
我很确定,它与逆变量有关,而不是与某些未知变量有关,因为如果我只是计算,退出也会发生:
la.inv(np.eye(n))
我认为它可能与事实有关,la.inv()
使用多个线程。
注意:如果我在没有并行化的情况下运行代码,它当然有效。 AND 它也有效,如果我只是评论上面的那一行。
但是如果我运行一些测试代码,那么可以最大限度地减少问题:
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()
没有做得更好