design-patterns - Go walk trees的Erlang翻译

标签 design-patterns go concurrency erlang

我正在尝试实现 here 中的 Walk 功能这是在 Go into erlang 中实现的。

结果如下:

-module(tree).
-export([walk/1,test/0]).


walk({Left, Value, Right}) ->
    spawn(tree,walk,[Left]),
    io:format(Value),
    spawn(tree,walk,[Right]);
walk({}) -> continue.



test() ->
B = {{}, alina, {}},
D = {{},vlad,{}},
C = {D, tea, {}},
A = {B,maria,C},
walk(A).

我不确定这是否属于代码审查部分,因为我不确定我所做的是否是我想要的。代码按预期工作(从某种意义上说它确实在树上行走)但是我不确定函数的设计是否是并发的。

最佳答案

该函数确实是并发的,因为您正在生成新进程来遍历子树。

你可能想要改变 tree:walk/1 以便它在成功行走的情况下返回原子 ok (我也关闭了 io :format/1erlang:display 以便值打印在不同的行上):

walk({Left, Value, Right}) ->
    spawn(tree,walk,[Left]),
    erlang:display(Value),
    spawn(tree,walk,[Right]),
    ok;
walk({}) -> continue.

这是同一函数的同步版本。我们使用递归代替进程:

walk_sync({Left, Value, Right}) ->
    walk_sync(Left),
    erlang:display(Value),
    walk_sync(Right);
walk_sync({}) -> continue.

关于design-patterns - Go walk trees的Erlang翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28972673/

相关文章:

java - "Refreshing"用于 ExecutorService 时固定大小的线程池

java - 如何在并发客户端之间广播消息?

scala - "become"是如何在支持actor模型的语言中实现的?

design-patterns - 观察者模式与装饰者模式一起使用

c# - 更新在另一个线程中创建的控件?

go - 防止 main() 函数在 Goroutine 在 Golang 中完成之前终止

php - 在PHP openssl_encrypt和golang河豚中匹配河豚加密

java - 在具体类需要数据库连接的项目上实现 DAO

C#:使用 "self"类型作为泛型参数?

sql - 用于 postgres json 插入的原始参数化字符串