0

假设我有一个主管树,有一个父母和一些孩子。孩子们是短暂的。但被其他进程使用。父母负责将用户指向正确的孩子。

User  ---lookup(child)-->  Parent
User <----PidOfChild-----  Parent

User  --request(Resouce)--> Child
User <------respond------   Child

假设孩子在两个序列之间关闭,关闭孩子以避免用户端崩溃的正确方法是什么?

用户可以监控孩子,但这真的有帮助吗?因为用户在一个事务中完成所有这些?

4

3 回答 3

2

在这种情况下,正确的解决方案是在用户端处理它:没有“关闭”孩子以使其响应用户的故障安全方法。总会有一个竞争条件会搞砸它。

如果您使用的是 gen_server:cast/call,您可以为请求失败之前等待多长时间提供超时并适当地捕获它。如果使用原始接收块:

receive
    some_response -> {ok, some_response}
after
    5000 -> % do something.
end.
于 2013-02-24T00:33:13.293 回答
1

如果您正在考虑另一种方法来避免在用户端出现某些内容,那么如果您正在调用父级并立即调用子级,则可以将父级设置为消息代理。

User  ---request(Resouce)-->  Parent --request(Resouce)--> Child
User <---reponse------------  Parent <-response----------- Child

父级必须将请求投射给子级,以避免阻塞。这样,父母也可以跟踪孩子并相应地响应用户。如果孩子关闭,它可以相应地重新启动,或者如果没有活动的请求,它可以关闭孩子。父母不应该有任何处理,因为它可能成为这种方法的瓶颈。

于 2013-02-25T16:00:17.817 回答
0

如果您的请求是在子关机之前构建的,您应该使用 receive ... after ... 或 gen_server:call 方案。如果您的请求是在子关闭后构建的,也许您可​​以将请求挂起直到超时或子可用。

于 2013-02-25T04:42:22.093 回答