Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python F2PY模块并联_Python_Fortran_F2py - Fatal编程技术网

Python F2PY模块并联

Python F2PY模块并联,python,fortran,f2py,Python,Fortran,F2py,我有一个现有的Fortran模块,我想并行运行。例如,我想要8个模块实例,每个实例都有自己的变量范围,所有实例同时工作。用f2py可以吗?从文档中可以看出,导入模块时,您只能访问Fortran对象的单个副本 我不熟悉Python,也不熟悉Fortran,所以请告诉我这种方法是否值得研究。是的,您可以像并行运行任何其他函数一样,从f2py对象运行导入的函数,例如使用concurrent.futures。例如,在python端它可以如下所示: import concurrent.futures as

我有一个现有的Fortran模块,我想并行运行。例如,我想要8个模块实例,每个实例都有自己的变量范围,所有实例同时工作。用f2py可以吗?从文档中可以看出,导入模块时,您只能访问Fortran对象的单个副本


我不熟悉Python,也不熟悉Fortran,所以请告诉我这种方法是否值得研究。

是的,您可以像并行运行任何其他函数一样,从f2py对象运行导入的函数,例如使用
concurrent.futures
。例如,在python端它可以如下所示:

import concurrent.futures as cf
import f2py_module as fm
# Or if a fortran module "my_module" is wrapped, do
from f2py_module import my_module as fm

print (fm.__doc__) # to see functions definitions, comment out

def task(arg):
    """This wrapper is not needed, but usually convenient to define
    redundant arguments or transforming the result somehow"""
    res = fm.calculate(arg) # calculate is a Fortran subroutine
    return res 

PEX = cf.ProcessPoolExecutor(4) # 4 threads here

args = [1,2,3,4,5] 

processes = [PEX.submit(task,arg) for arg in args]
res = [pr.result() for pr in processes]

for re in res:
    print(re)

可能,在Python中使用一些多处理库并从每个进程中加载Fortran模块?当然可以。您可以正常导入F2PY创建的库。您可以使用
concurrent.futures
中的
ProcessPoolExecutor
来运行任何东西的多个实例,包括F2PY函数。不需要从不同的流程导入。根据OP所说的“每个流程都有自己的可变范围”,这种方法可能无法按预期工作。考虑以下MyOxMuldi.F90:<代码>模块MYO模块的输出;隐式无;整数::mod_num=0;包含;子程序计算(num,res);整数,意图(in)::num;整数,意图(输出)::res;mod_num=mod_num+num;res=mod_num;结束子程序计算;结束模块my_模块我同意,很好。如果执行更改Fortran模块的状态,将产生意外的结果。因此,我们需要确保不要这样做。考虑到python导入是如何工作的,可能很难对每个进程的模块进行沙箱处理。但是,对于任何模块中的任何python函数,情况不是这样吗?它们“无法”被重新导入,如果它们更改模块的状态(可能使用
全局
),则会出现意外行为。可能从全局索引中删除它们,然后导入在这两种情况下都会起作用。我同意你所说的,考虑到我如何理解OP提出的问题,我认为这可能是一个有用的澄清,可以添加到答案中。