我们有一个用例,其中设置如下:主Actor类型和Worker Actor类型。
主程序接收输入的工作请求,并使用工作人员编排和生成结果。
有一个计划创建一个名为client.java的Java类。这将创建一个新的主实例并将工作发送给它。这个客户端使用- Patterns.ask来获取将来的指针和后面的块,直到结果到达为止。
Patterns.ask(master, initialMessage, t);
Await.result to get the messagePatterns.ask的内部文档表示,将创建一个临时参与者。但是,当我调用并试图在主服务器内部打印发送方的hashCode时,每次似乎都是相同的参与者。
我有以下关切:
发布于 2015-08-25 09:45:10
我还没有读过Patterns.ask内部文档,但我假设它使用ActorRef.forward(消息、上下文)来坚持消息发送方。
另外,您不应该阻塞(Await.result()),而应该使用akka.dispatch.Futures提供的工厂方法来应用回调。您将能够链接和恢复未来的任务(以及更多的任务),并获得更好的应用程序性能,如下所述:
Futures
发布于 2015-08-25 14:53:06
所有参与者至少在一个或多个线程池上运行(您可以在Akka的默认application.conf文件中配置这些线程池)。这些是普通的,所以如果您想知道更多,请看ExecutorService源代码)。Akka (实际上是演员模型)的美妙之处在于,每一个常规的演员都是孤立的和非类型化的,迫使你“要求”一个演员去变异一个状态或者用一个状态来回复,而不是用普通的线程来完成它。
当两个角色都在不同的线程上运行时,我假设Akka会在内部解决所有昂贵的锁定和低级别并发问题,因为开发人员不必这样做。每个演员都有自己的邮箱(由ConcurrentLinkedQueue支持,不是阻塞)。这意味着,无论您发送给某个参与者的任何消息,无论是触发和忘记类型,还是状态请求(ask),它都被排队到邮箱,并按FIFO顺序顺序处理。
https://stackoverflow.com/questions/32198803
复制相似问题