使用fortran库进行Python多处理

时间:2013-12-19 02:58:02

标签: python multiprocessing f2py

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

0 个答案:

没有答案