首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >akka patterns.ask实现细节

akka patterns.ask实现细节
EN

Stack Overflow用户
提问于 2015-08-25 08:12:43
回答 2查看 457关注 0票数 0

我们有一个用例,其中设置如下:主Actor类型和Worker Actor类型。

主程序接收输入的工作请求,并使用工作人员编排和生成结果。

有一个计划创建一个名为client.java的Java类。这将创建一个新的主实例并将工作发送给它。这个客户端使用- Patterns.ask来获取将来的指针和后面的块,直到结果到达为止。

代码语言:javascript
复制
Patterns.ask(master, initialMessage, t);      
Await.result to get the message

Patterns.ask的内部文档表示,将创建一个临时参与者。但是,当我调用并试图在主服务器内部打印发送方的hashCode时,每次似乎都是相同的参与者。

我有以下关切:

  1. 如何管理Patterns.ask的并发调用?它是否会像调用后的线程一样发生,询问是否得到了未来的指针,但在其中放错了数据?
  2. 它如何保证未来指针只包含相关的答复,而不与其他人的答复混在一起? For ex: FutureX =未来期望X消息 FutureY =未来预期的Y消息 FutureX得到Y,FutureY得到X,这会发生吗?
EN

回答 2

Stack Overflow用户

发布于 2015-08-25 09:45:10

我还没有读过Patterns.ask内部文档,但我假设它使用ActorRef.forward(消息、上下文)来坚持消息发送方。

另外,您不应该阻塞(Await.result()),而应该使用akka.dispatch.Futures提供的工厂方法来应用回调。您将能够链接和恢复未来的任务(以及更多的任务),并获得更好的应用程序性能,如下所述:

Futures

票数 0
EN

Stack Overflow用户

发布于 2015-08-25 14:53:06

所有参与者至少在一个或多个线程池上运行(您可以在Akka的默认application.conf文件中配置这些线程池)。这些是普通的,所以如果您想知道更多,请看ExecutorService源代码)。Akka (实际上是演员模型)的美妙之处在于,每一个常规的演员都是孤立的和非类型化的,迫使你“要求”一个演员去变异一个状态或者用一个状态来回复,而不是用普通的线程来完成它。

当两个角色都在不同的线程上运行时,我假设Akka会在内部解决所有昂贵的锁定和低级别并发问题,因为开发人员不必这样做。每个演员都有自己的邮箱(由ConcurrentLinkedQueue支持,不是阻塞)。这意味着,无论您发送给某个参与者的任何消息,无论是触发和忘记类型,还是状态请求(ask),它都被排队到邮箱,并按FIFO顺序顺序处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32198803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档