gpt4 book ai didi

c# - Akka.net等待多条数据

转载 作者:太空狗 更新时间:2023-10-29 18:35:09 26 4
gpt4 key购买 nike

这是我遇到的一个常见场景,我有两个(或更多) Actor 异步获取一些数据,然后我需要在他们全部完成后执行操作。

执行此操作的常见模式是什么?

这是一个简化的例子。

public MasterActor : ReceiveActor
{
public MasterActor()
{
Initialize();
}

public void Initiaize()
{
Receive<DoSomeWork>(_ =>
{
var actor1 = Context.ActorOf(Props.Create(() => new Actor1());
var actor2 = Context.ActorOf(Props.Create(() => new Actor2());

// pretend these actors send responses to their senders
// for sake of example each of these methods take between 1 and 3 seconds
actor1.Tell(new GetActor1Data());
actor2.Tell(new GetActor2Data());
});

Receive<Actor1Response>(m =>
{
//actor 1 has finished it's work
});

Receive<Actor2Response>(m =>
{
//actor 2 has finished it's work
});
}
}

为了启动它,我向 MasterActor 发送了一条 DoSomeWork 消息。

当我同时拥有 Actor1ResponseActor2Response 时,执行操作的常用方法是什么。

我真的不想在每个接收处理程序中都有逻辑来检查另一个接收处理程序是否已完成或类似的事情。我猜我在想什么类似于 Task.WaitAll() 方法。

我只是以错误的方式解决问题吗?我是否需要以不同的方式重写 Actor ?

任何常见的模式或解决方案都会很棒。

最佳答案

常见的解决方案是附加某种由请求和响应消息共享的相关 ID - 由于 actor 同步处理消息,这可能是未经检查的 int/long 计数器。

您只需将关联 ID 存储在调用方内部的某个数据结构(比如说集合)中,并在收到响应时从集合中删除它的关联 ID。 WaitAll 基本上在 set 为空或超时时结束。

你可以使用Context.SetReceiveTimeout(timeout)设置超时,这样actor会在它没有收到任何消息后发送一个ReceiveTimeout方法给自己时间。

这种行为非常通用,可以很容易地抽象出来。

关于c# - Akka.net等待多条数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33398923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com