有几个人与我一起在一个项目上工作,一直在试图找出处理这个问题的最佳方法。看起来这应该是一个经常需要的标准事物,但由于某种原因,我们似乎无法得到正确的答案。了解akka演员何时完成
如果我有一些工作要做,并且我在路由器上扔了一堆消息,我怎么知道所有的工作都完成了?例如,如果我们正在读取一百万行文件的行,并将行发送给行动者以处理此行,并且您需要处理下一个文件,但必须等待第一个文件完成,那么如何知道它何时发生做完了?
还有一点评论。我知道并使用了Patters.ask()使用的Await.result()和Await.ready()。一个区别是,每条生产线都会有一个未来,我们将有大量的这些期货等待,而不仅仅是一个。此外,我们正在填充一个占用大量内存的大型领域模型,并且不希望增加额外的内存来保存等待编写的内存中的相同数量的未来,同时使用每个人在完成它的工作后完成而没有等待内存等待组成。
我们使用Java而不是Scala。
伪代码:
for(File file : files) {
...
while((String line = getNextLine(fileStream)) != null) {
router.tell(line, this.getSelf());
}
// we need to wait for this work to finish to do the next
// file because it's dependent on the previous work
}
这似乎是你经常想做很多工作,当它与演员完成知道。
在您的设计中,什么能阻止ProcessFiles一次处理多个文件?如果它一次收到50个文件,是不是同时开始在所有文件上工作?也许if(awaitingCount <= 0)应该被添加到if(msg instanceof ProcessFiles)呢? –
这个设计意味着短暂的'FileProcessor'仅仅意味着在其自身停止之前在其生命周期中提供一个'ProcessFiles'请求。它不打算提供多个'ProcessFiles'请求。如果您有更多的请求,请启动该演员的更多实例。或者,你可以像你说的那样做一些事情,并且在接收中有一个if块,看看它是否已经在处理一批文件,如果是这样,可能只是将新的传入文件列表追加到当前文件列表中处理。 – cmbaxter