gpt4 book ai didi

c# - 嵌套请求的正确模式

转载 作者:太空宇宙 更新时间:2023-11-03 19:57:08 24 4
gpt4 key购买 nike

我有一个有很多 child 的 Actor ,我正在查询它以获取其 child 的数据汇总。此操作可能需要几秒钟。

我正要这样做,但感觉完全错了。 handle 方法由 Ask<> 调用.

public void Handle(Message message)
{
var children = Context.GetChildren();
var tasks = new List<Task<Result>>();

foreach (var child in children)
{
var t = child.Ask<Result>(new Query);
tasks.Add(t);
}

Task.WaitAll(tasks.ToArray()); // Gah!
// do some work
Sender.Tell(new Response(new Results()));
}

我有一些想法,但我不想重新发明一个 20 边形的轮子,所以想听取一些意见。

我担心对 Sender 的引用当我终于调用Tell时它会指向什么因为它是一个静态调用。

我最终使用了 Task.WhenAll延续,但仍然不相信这是正确的 Akka 方式——这就是这里的重点。我可以让它发挥作用,我只是想知道最佳实践选项。

最佳答案

一般来说,Ask 应该只用于与来自外部服务的 actor 的通信,几乎从不用于两个 actor 之间。它比使用 Tell 昂贵得多。另一个问题是使用 Task.WaitAll,它实际上会阻塞当前线程,直到所有响应都到达,这对性能也很不利,并可能最终导致死锁。

类似thread已经在 github 上讨论过了。

聚合问题的一般解决方案是:

  • 为聚合过程创建一个单独的参与者。
  • 用 Actor 列表初始化它,它应该从 Actor 那里收集数据并记住 Actor ,收集的结果将通知 Actor 。
  • 为每个参与者发送请求/查询。
  • 处理每个请求/查询响应,将其聚合到单独的数据结构中,并从等待参与者列表中删除发送者。
  • 一旦没有 Actor 等待 - 发送结果并停止当前 Actor (负责数据聚合的 Actor )。
  • 附加 ReceiveTimeout 机制以防万一,当由于某种原因并非所有参与者都能够在合理的时间内做出响应时 - 当超时发生时,您可能会返回失败或到目前为止收集的响应列表。<

PS:不要使用 TypedActor - 它对性能也不利,并且已经/将会被淘汰。

关于c# - 嵌套请求的正确模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32424776/

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