标签:planet arc 互联网 self lis image actor 这就是我 十分钟
Joe Armstrong最喜欢的一段Erlang程序导读:最近网友又翻出一篇Erlang之父Joe Armstrong生前经典的帖子,并引发了热议,高可用架构翻译如下。
前几天,我收到了来自罗文大学的Dean Galvin的邮件。 Dean在做一个Erlang项目,所以他问“哪个示例程序最能体现Erlang的特性”。
他想要一段很小的代码,以便在十分钟的演讲中完美的展示这门语言。 我想了一会儿...并迅速编写了我最喜欢的程序,这就是“通用服务器”。
这就是我的“通用服务器”代码:
universal_server() ->
receive
{become, F} ->
F()
end.
代码还是挺容易理解的。 一旦创建了universal_server,它就会等待{become,F}消息,然后有消息到来的时候调用F。
阶乘服务器
阶乘服务器是等待整数并返回整数的阶乘的服务器。代码同样很简单:
factorial_server() ->
receive
{From, N} ->
From ! factorial(N),
factorial_server()
end.
factorial(0) -> 1;
factorial(N) -> N * factorial(N-1).
现在万事俱备。
整合代码
我将编写一个很短小的函数来创建通用服务器,该服务器向其发送“become factorial_server”消息,然后向其发送一个整数,等待响应并输出返回值:
test() ->
Pid = spawn(fun universal_server/0),
Pid ! {become, fun factorial_server/0},
Pid ! {self(), 50},
receive
X -> X
end.
所有这些函数都位于模块/code/fav1.erl。
现在我们要做的就是启动一个Erlang shell并运行测试程序
$ erl
1 > c(fav1).
{ok, fav1}
2 > fav1:test().
30414093201713378043612608166064768844377641568960512000000000000
旁白
几年前,当我在SICS时,我可以使用Planet Lab。 Planet Lab是9000台计算机的研究网络。加入Planet Lab很容易,您所要做的就是购买一台标准PC,将其连接到网络,并将其捐赠给Planet Lab组织。将您的机器捐赠给网络后,您可以使用Planet Lab中的所有其他机器作为回报。
Planet Lab是用于分布式应用程序的实际测试平台,目前在562个站点上有1171个节点。
我想用Planet Lab做什么?我没有头绪。我最终要做的是编写一些脚本,以在所有Planet实验室机器上安装空的通用Erlang服务器(非常类似于本文中的代码)-然后,我建立了一个gossip算法,让become消息充斥网络。然后我有了一个空的网络,在几秒钟内它将变成我想要做的任何事情。
大约一年后,我不得不写一篇论文。成为研究人员的缺点之一是为了赚钱必须发表论文,也许论文内容你永远不会感兴趣,但是必须是研究项目期望的内容。
我在Planet Lab上建立了gossip网络,我可以说它变成了任何东西,后来我让它成为了内容分发网络,并使用gossip算法在网络上所有计算机上复制了同一文件,并写了一篇论文描述它。
原文链接:
https://joearms.github.io/published/2013-11-21-My-favorite-erlang-program.html
参考阅读:
本文作者 Joe Armstrong,由高可用架构翻译。技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。
标签:planet arc 互联网 self lis image actor 这就是我 十分钟
原文地址:https://blog.51cto.com/14977574/2546286