我有两种功能并行运行的情况。
下面是示例伪代码。
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)并行运行?
答案 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
”,但是在该示例中,您“顺序”创建了用于并行告诉的数组,整个过程非常非常效率低下。)他的代码在技术上可以按照您的要求进行操作,实际上是荒谬的:除了显着降低代码速度之外,它什么也做不了。
简而言之,我想你也是