使用一个响应从一个演员在当前进程的演员

0

的问题

我困惑我是如何应解决这种情况在非阻挡的方式。

考虑两个行动者 Actor1Actor2

Actor1

Map<Int, Int> foo() {
     List<String> finalList = foo_2();
     Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

List<String> foo_2() {
    
     CompletableFuture<List<String>> Querylist = ask(Actor2)
     Querylist.get();
     
     return QueryList;
}

目前内foo_2, Querylist.get() 是一个阻止的呼吁。 我想以某种方式解决这一非阻挡的方式。 我创建了一个消息的适配器 Actor2 内部 Actor1 因此,任何消息 Actor2 发会处理的 Actor1.

我用以下方法,以修改阻止调用

Map<Int, Int> foo() {
     CompletionStage<List<String>> finalList = foo_2();
     finalList.whenComplete(
        // what to do here? 
     )
     // Map<Int, Int> finalMap = // do stuff with finalList to get Map<Int, Int>;

     return finalMap;
}

CompletionStage<List<String>> foo_2() {
    
     CompletionStage<List<String>> Querylist = ask(Actor2)
     
     
     return QueryList;
}

我不知道该如何正确使用CompletionStage构获得同样结果我得到一个阻止未来。获得()call.

2

最好的答案

1

如果你使用Akka类型(暗示的标签),你不应该需要一个未来或消息的适配器。 只是使用 ActorContext.ask.

请参阅 文件的请求-回应要求之间的两个演员.

广泛地说,你会摆脱的 foofoo_2 方法,将消息转接器设置进入 ActorContext.ask 呼叫,并替换的情况,你曾经被称为 foo 一个呼叫 ActorContext.ask. 如果回答你的演员发送消息,这导致了要求取决于响应的要求,那么一个好的做法是嵌入所需的部分的状态进入到消息的适配器生成的。

2021-10-25 00:19:07

感谢您的回答,这是我结束了这样做的。 你会知道之间的区别是什么做的。告诉()与使用ActorContext.问()? 是你路过的"处理"中明确ActorContext.问()?
PyWalker2797

这要求最终完成所有工作的管理该请求的响应相互作用:它是建立在告诉(或多或少都在Akka,在所有)。 广泛地说,问会产生一个演员而注入一个参考,作为演员的回复地址在消息发送。 当那个演员收到消息,就执行适配器并转发适于应对的演员发送的问;演员还有时间表的消息本身对超时之后到期的其它转变成超时信息。
Levi Ramsey

因为它会产生一个演员对收到的答复,这略低效率比登记的消息适配器,做个告诉和调度超时消息给你自己。 然而,可以有任意的许多要求与不同的适配器在飞行:有告诉+适配器,你可以打限制的一个适配器按类型(注册一个不同的适配器对于同一类可能是不可预测和继承权,也可能严重破坏这个方法)。 告诉+器的做法的确有的优点是允许多个答复。
Levi Ramsey

清除了很多。 你知道大致,如何显着的开销吗?
PyWalker2797

你也可以帮助我的另一个问题 stackoverflow.com/questions/69725512/...
PyWalker2797

开销是可以忽略不计:几百个字节的存储的消耗,并可能是一个微秒或以额外的等待时间得到答复的提问.
Levi Ramsey
1

你可以使用 pipeToSelfhttps://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#send-future-result-to-self发送的结果,问到演员的本身。 而不是试图获得的价值 finalList 直接在foo(),这是唯一可能有阻塞 get结果foo()可以被送到演员的本身,在这种情况下你处理它像任何其他信息。 这是很好的做法来创建一个特定的信息类型。

你也应该看一看 CompletionStage 方法中,最重要的是 thenApply (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html#thenApply-java.util.function.Function-),这使得它可以变换的结果,例如以创建一个 MapfinalList,例如一个 MapMessageMap. 然后你会处理的 MapMessage 像任何其他信息的演员。

2021-10-25 00:12:28

嗨谢谢你的回答。 最终我去,与接受的答案,因为它似乎更多地道的.
PyWalker2797

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................