模拟网格。同时接到两个任务

SimGrid. Simultaneous receiving two tasks

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

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

worker 进程存在于此主机中。 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:

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

    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.main(Tier1.java:46)
    at org.simgrid.msg.Process.run(Process.java:338)

我应该如何正确地声明流程?

想法是让工作进程生成其他进程来侦听不同的邮箱。例如像(我还没有测试过)

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() 方法有两个参数:进程 运行 所在的主机的名称,以及进程本身的名称。这里我们声明一个唯一的进程名称,将用作邮箱名称(因此邮箱 = getName())。

不要忘记在某个时候终止这些进程,因为它们会永远 运行。因此,您可能希望将所有派生的进程放在一个向量中以缓解这种情况。