如何一次调用两个参与者,即并行?

时间:2019-07-04 07:30:17

标签: java multithreading akka

我有两种功能并行运行的情况。

下面是示例伪代码。

MainActor{
 // retrive company ids
 //for each company id i need to run another two different actions simultaniously 
   tell(A_Actor)
   tell(B_Actor)
//if I call above they are calling sequentially i.e. first it runs tell(A_Actor)
//then comes to tell(B_Actor).
//If tell(A_Actor) fails it wont run tell(B_Actor).
}
A_Actor{
// do ingest into a file.
}

B_Actor{
// do ingest into a DB.
}

问题: 如何运行两个功能,即tell(A_Actor)和tell(B_Actor)并行运行?

2 个答案:

答案 0 :(得分:1)

tell方法是异步的。当您将actorA发射到actorA时,它不会等到tell actorB完成或崩溃后才能执行下一个操作,这就是tell

如果需要同时使用两个 val tellActions = Vector(() => actorA.tell(messageA, senderActor), () => actorB.tell(messageB, senderActor)) tellActions.par.foreach(_.apply()) 方法,则可以执行以下操作:

{{1}}

请注意,这是Scala代码

答案 1 :(得分:0)

在一些评论(包括我的评论)中已经指出了这一点,但我认为它应该得到答案。

简而言之,您需要区分并行调用tell方法和参与者在并行执行的receive方法中执行的功能。该功能将自动并行执行,并且并行调用tell方法没有任何意义。

您显示的代码执行文件中的提取并并行提取到DB中。这是自动的,不需要您采取任何措施;这就是演员和tell的工作方式。而且,尽管您说了什么,但是如果文件提取出现问题,它将不会影响到数据库的提取。 (假定您正确构建了参与者和消息,因为您没有列出它们的实现。)

tell方法是异步的:它几乎立即返回并且不执行实际的逻辑(在这种情况下为输入):它唯一要做的就是将邮件放在收件人的邮箱中。从理论上讲,Ismail的答案向您展示了如何并行“调用tell”,但是在该示例中,您“顺序”创建了用于并行告诉的数组,整个过程非常非常效率低下。)他的代码在技术上可以按照您的要求进行操作,实际上是荒谬的:除了显着降低代码速度之外,它什么也做不了。

简而言之,我想你也是

  • 您的演员及其如何称呼他们有根本的错误。
  • 您实际上是在并行执行该功能,只是您没有意识到它,因为您正在错误地测量/观察某些东西。