SimGrid。同时接收两个任务

时间:2016-05-11 19:36:19

标签: java simgrid

在platform.xml文件中声明了主机的功能:

<host id="Tier1_1" core="2" speed="100f"/>

worker进程位于此主机中。 工人如何同时接收和执行两项任务(如果核心数为2)? 现在我使用这样的代码,但在这种情况下它不起作用(这段代码不能同时接收两个任务,只有一个);

while(true) {
    commReceived = Task.irecv("Tier1_" + num);
    commReceived.waitCompletion();
    if (commReceived.test()){
        task = commReceived.getTask();
        commReceived = null;
        Msg.info("Receive " + task.getName());
        task.execute();
        Msg.info("End to execute " + task.getName());
    }

UPD

现在我使用这段代码。有两个进程具有相同的邮箱&#34; Tier1_2&#34;。我将isend发送到邮箱(&#34; Tier1_2&#34;):

    for (int j=0; j<2; j++){
        Process process = new Process(getHost().getName(), "Tier1_2_" + j) {
            @Override
            public void main(String[] strings) throws MsgException {
                while (true){
                    commReceived = Task.irecv("Tier1_2");
                    commReceived.waitCompletion();
                    if (commReceived.test()){
                        task = commReceived.getTask();
                        commReceived = null;
                        Msg.info("Receive " + task.getName());
                        }
                }
            }
        };process.start();

    }

但它给出了:

Exception in thread "Thread-5" java.lang.NullPointerException
    at LHCb.Tier1$1.main(Tier1.java:46)
    at org.simgrid.msg.Process.run(Process.java:338)

我应该如何正确地宣布流程?

1 个答案:

答案 0 :(得分:1)

这个想法是让工作进程产生监听不同邮箱的其他进程。例如(我还没有测试过)

for (int i = 0; i < 2; i++) {
    Process p = new Process(getHost.getName(), "Tier1_" + i) {
        public void main(String[] args) throws MsgException {
        String mailbox = getName();
        while(true) {
          commReceived = Task.irecv(mailbox);
          commReceived.waitCompletion();
          if (commReceived.test()){
            task = commReceived.getTask();
            commReceived = null;
            Msg.info("Receive " + task.getName());
            task.execute();
            Msg.info("End to execute " + task.getName());
          }
        }
      });
      p.start();
}

新的Process()方法有两个参数:运行进程的主机的名称,以及进程本身的名称。这里我们声明一个唯一的进程名称,它将用作邮箱名称(因此是mailbox = getName())。

不要忘记在某些时候杀死这些进程,因为它们会永远运行。因此,您可能希望将所有生成的进程放在向量中以简化该操作。