我在Python中使用多处理模块将一组作业映射到尽可能多的核心。我正在包装的作业大多是用一些包裹的fortran代码执行的(用f2py包装)。当我只调用这些作业时,它们会使用所有核心进行处理。但是,如果我尝试独立调用fortran库(不是通过Pool().map()
函数)首先,然后然后调用地图,整个程序就会挂起(如果你想知道,它正好挂在threading.py的第339行,唯一的代码是waiter.acquire()
}。
对于我正在编写的程序,我需要先调用库,然后再进行映射。我通过在一个进程中首先使用Pool().map()
调用它来解决这个问题,但这是一个hack,我想知道为什么我必须这样做!
更明确地说,不工作:
def call_camb_transfer(H0): #wraps the call to define the keyword parameter to pass
return pycamb.transfers(H0=H0)[1][6, :, 0]
b = call_camb_transfer(70)
pool = multiprocessing.Pool(2)
H0 = [60, 70]
results = pool.map(call_camb_transfer, H0)
但这样做:
def call_camb_transfer(H0): #wraps the call to define the keyword parameter to pass
return pycamb.transfers(H0=H0)[1][6, :, 0]
initial_pool = multiprocessing.Pool(1)
b = initial_pool.map(call_camb_transfer, [65.0])
pool = multiprocessing.Pool(2)
H0 = [60, 70]
results = pool.map(call_camb_transfer, H0)
其中pycamb
是CAMB的python包装器,它是一个fortran库。