在p中与python并行处理更显式

2024-03-29 06:26:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个python脚本,它可以驱动多个MPI模拟(F90可执行文件,尽管这无关紧要)。每个MPI模拟都使用2个处理器。假设我想同时运行三个MPI模拟。如果我在3个不同的终端上从命令行运行这3个模拟,没有python,它们每个都有自己的2个处理器,运行起来就像世界上只有它们一样。你知道吗

我当前的实现似乎没有这样做。从跟踪MPI仿真可以明显看出,MPI仿真之间存在竞争。这是我目前的程序

import subprocess
import multiprocessing as mp

def execute(inputs, output):
    do_stuff_with_inputs()
    subprocess.call('mpiexec -np 2 my_executable.x', shell=True)
    results = post_process_stuff()
    output.put(results)


output = mp.Queue()
processes = []
for i in xrange(3):
    process.append(mp.Process(target=execute, args=args)))

for p in process:
    p.start()

for p in process:
    p.join()

results = [output.get() for p in process]

我想做的是对这个过程更加明确,以某种方式在python中“创建”处理器空间,以便可执行调用有自己的专用处理器数量。你知道吗


Tags: inimport脚本foroutputexecuteargsmp
6条回答

我们可以创建一个anonymous class的对象来实现接口:

Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.

如果您有一个接口,它声明了一个方法toString,那么您可以首先创建一个实现这个接口的类,然后创建这个类的对象:

interface TestA {
    String toString();
}

class TestB implements TestA {
    @Override
    public String toString() {
        return "test";
    }
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestB());
    }
}

或者你可以创建一个匿名类的对象来简化代码:

interface TestA {
    String toString();
}

public class Test {
    public static void main(String[] args) {
        System.out.println(new TestA() {
            @Override
            public String toString() {
                return "test";
            }
        });
    }
}

在这两种情况下,它都会打印^{

test应该是输出。这是一个匿名内部类的示例

这是一种非常常见的模式,用于Comparator接口模拟闭包

诀窍不仅仅是关于匿名内部类,这会打印测试,因为它会覆盖toString方法,而System.out.println它隐式调用对象的toString方法

我不知道这个问题的意义。如果这是一个面试问题,那么我可以说没关系。但在实时情况下,这不是实现继承的正确方法。现在来回答这个问题,这里你要做的是一个匿名的内部类

在这里,您将实例化一个,并通过编写

System.out.println(new TestA() {
    public String toString() {
        return “test”;
    }
}); 

当然,结果会是test

也试试这个。。。生成匿名类的名称

Inter instance = new Inter() {
    public String getString() {
        return "HI" + this.getClass();
    }
};

你在这里看到的是anonymous inner class

给定以下接口:

interface Inter {
    public String getString();
}

您可以创建类似它的实例,如下所示:

Inter instance = new Inter() {
    @Override
    public String getString() {
        return "HI";
    }
};

现在,您有了一个您定义的接口的实例。但是,您应该注意,您实际上所做的是定义一个类,该类实现接口并同时实例化该类

相关问题 更多 >