gpt4 book ai didi

erlang - 如何将有向图传递给不同的进程和节点?

转载 作者:行者123 更新时间:2023-12-04 11:22:16 25 4
gpt4 key购买 nike

我创建了一个 digraph进程 A 上的术语,我想将此有向图传递给另一个节点上的进程。每当我在另一个过程中使用这个有向图时,我都会收到错误,例如:

** {badarg,
[{ets,insert,[598105,{"EPqzYxiM9UV0pplPTRg8vX28h",[]}],[]},
{digraph,do_add_vertex,2,[{file,"digraph.erl"},{line,377}]},

因为一个 有向图 基于 ETS,这似乎要复杂得多,使得有向图在它创建的过程中几乎是独立的。我发现这个条目揭示了一个类似的问题: ETS on a different process

我知道我可以在 中创建有向图服务器 然后通过 otp 消息连接到它,但我不能在我的架构中这样做。所有节点都可以使用旨在将状态作为条款传递的特定方法进行通信。

在我看来,将有向图发送到无法直接相互通信的不同节点是不可能的。总的来说, 看来有向图不能直接序列化 .我在想我可以将有向图“展开”作为顶点和边的列表,然后在另一个过程中传输和重新创建它(效率不高、性能不高或优雅)。关于 的更好方法的任何想法序列化 它 ?有没有办法从 ETS 存储中序列化有向图状态?

有什么想法吗 ?

最佳答案

你可以像这样序列化/反序列化一个有向图;

serialize({digraph, V, E, N, B}) ->
{ets:tab2list(V),
ets:tab2list(E),
ets:tab2list(N),
B}.

deserialize({VL, EL, NL, B}) ->
DG = {digraph, V, E, N, B} = case B of
true -> digraph:new();
false -> digraph:new([acyclic])
end,
ets:delete_all_objects(V)
ets:delete_all_objects(L)
ets:delete_all_objects(N)
ets:insert(V, VL)
ets:insert(E, EL)
ets:insert(N, NL)
DG.

这是我用来测试的代码;
passer() ->
G = digraph:new(),
V1 = digraph:add_vertex(G),
V2 = digraph:add_vertex(G),
V3 = digraph:add_vertex(G),
digraph:add_edge(G, V1, V2, "edge1"),
digraph:add_edge(G, V1, V3, "edge2"),
Pid = spawn(fun receiver/0),
Pid ! serialize(G).

receiver() ->
receive
SG = {_VL, _EL, _NL, _B} ->
G = deserialize(SG),
io:format("Edges: ~p~n", [digraph:edges(G)]),
io:format("Edges: ~p~n", [digraph:vertices(G)])
end.

相当丑陋的解决方案,但有效。我认为这是在节点之间传递有向图的唯一方法,因为 ets 表不能在节点之间共享。

编辑:删除不必要的循环

关于erlang - 如何将有向图传递给不同的进程和节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552796/

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