5

我正在使用 Python 中的多处理模块将一组作业映射到我拥有的尽可能多的内核上。我包装的工作主要是用一些包装的 fortran 代码(用 f2py 包装)执行的。当我只调用这些作业时,它们使用所有内核都很好。但是,如果我尝试先独立调用 fortran 库(而不是通过函数Pool().map()),然后调用 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)

CAMB 的 python 包装器在哪里pycamb,它是一个 fortran 库。

4

0 回答 0