在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)
我应该如何正确地宣布流程?
答案 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())。
不要忘记在某些时候杀死这些进程,因为它们会永远运行。因此,您可能希望将所有生成的进程放在向量中以简化该操作。