我正在使用 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 库。