在超级用户树中终止子进程的正确方法是什么

时间:2013-02-24 00:14:13

标签: concurrency erlang otp

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

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

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

让我们说孩子在两个序列之间关闭,为了避免用户端崩溃,关闭孩子的正确方法是什么?

用户可以监控孩子,但这确实有帮助。既然用户在一次交易中做了所有这些?

3 个答案:

答案 0 :(得分:2)

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

如果您正在使用gen_server:cast / call,则可以在请求失败之前提供等待时间的超时并正确捕获它。如果使用原始接收块:

receive
    some_response -> {ok, some_response}
after
    5000 -> % do something.
end.

答案 1 :(得分:1)

如果您正考虑采用另一种方法来避免在用户端拥有某些内容,则可以将父级作为消息代理,如果您正在呼叫父级并立即呼叫子级。

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

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

答案 2 :(得分:0)

如果您的请求是在子项关闭之前构建的,则应使用receive ... after ...或gen_server:call scheme。 如果你的请求是在孩子关闭之后构建的,也许你可以等待超时请求或者孩子是avalibe。