图处理与网络模拟:Elixir 实践
1. 进程状态恢复与图修复
1.1 进程重启与状态处理
在处理进程时,我们希望进程以新身份和旧状态重新启动。首先获取进程状态:
state = GraphCompute.State.get()
{:ok, state}
对于进程终止的情况,我们只需将进程状态推送到代理即可:
defp do_terminate(state) do
GraphCompute.State.update(state)
end
1.2 图的恢复
当节点进程因某种原因终止并由监管者重新创建后,虽然状态已恢复,但进程以新的 PID 运行,此时进程处于监管之下,但不在进程图结构内。为解决这个问题,我们需要记住进程崩溃前的旧 PID,然后使用 Graph.replace_vertex/3 函数更新进程图:
iex> pg = Graph.replace_vertex(pg, old_pid, new_pid)
1.3 缓存新旧 PID
为了管理旧 PID 和新 PID,我们在进程创建时通过 self/0 获取新 PID,并将其存储在 :pid 字段中。同时,从存储的进程状态中获取旧 PID(如
超级会员免费看
订阅专栏 解锁全文
34

被折叠的 条评论
为什么被折叠?



