文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

前几天,我收到了来自罗文大学的Dean Galvin的邮件。迪安在做一个项目,他问我“什么样的Erlang样例程序最能体现Erlang的特点”。

他想要一个小程序,可以适合在十分钟里最好地展示Erlang这门语言的特点。我思考了一阵子然后快速地写出了我最喜欢的程序,它叫做“通用服务器”。

通用服务器

一般来说服务器都是做特定的事情的。一个HTTP服务器响应HTTP请求而一个FTP服务器响应FTP请求,等等。那么什么是通用服务器呢?我们肯定能归纳出一个服务器的概念,然后做出一个通用服务器,并且我们可以在晚些时候让它变成一个特定的服务器。

第 1 段(可获 1.51 积分)

下面就是我的通用服务器:

universal_server() -> 
    receive 
        {become, F} -> 
            F() 
    end.

这个服务器相当简单。一旦我创建了一个通用服务器,它只是呆在那里等待一个 {become, F}消息,收到这样的消息后,他就变成了F服务器。

阶乘服务器

一个阶乘服务器就是等待一个整数然后返回这个整数的阶乘。下面就是非常简单的例子:

factorial_server() -> 
    receive 
        {From, N} -> 
            From ! factorial(N), 
            factorial_server() 
    end. 

factorial(0) -> 
    1; 
factorial(N) -> N * factorial(N-1).
第 2 段(可获 0.74 积分)

现在我们已经准备好high起来了。

把它们集成起来

我将写一个小函数来创建一个通用服务器,然后给它发送“变成阶乘服务器”消息,接着我将发送一个整数给它,等它返回结果并打印出来。

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
第 3 段(可获 0.91 积分)

小故事

多年前当我在SICS的时候,我接触到 Planet 实验室。Planet 实验室是一个有9000台计算机的研究网络。加入Planet实验室很容易,你所要做的是买一台标准PC,将它连接到网络并捐献它的使用给Planet实验室组织。你捐献你的机器给这个网络,相应的你可以使用Planet实验室里的所有其他机器。

Planet实验室是一个为分布式应用的真实世界的测试环境,它当前有1171个节点在562个站上。

当时我要用Planet实验室来做什么呢?我也不知道。最终我做的是写一些脚本在所有Planet实验的机器上安装了空转的通用服务器(和本文的代码很相似)。然后我设计了一套goosip算法来给这个网络发送 become 消息。这样我就有了一个空转的网络,我可以在数秒内将它变成我想要的任何服务器。

第 4 段(可获 2.11 积分)

大概一年后,我必须要写一篇论文。作为一个研究者,最不划算的一个事情就是为了挣钱养家你必须要写关于这样或那样的论文,这样的论文所写的从来不是你当时感兴趣的,但是却一定是关于资助你研究的项目所期望读到的。

我已经在Planet实验室上建立了我的gossip网络,我可以让它成为任何服务器,因此我让它成为一个内容分发网络并且用一个gossip算法来将一个同样的文件拷贝到这个网络上的所有机器上。最后我把这件事写成一篇论文然后大家都哈皮了。

第 5 段(可获 1.48 积分)

文章评论