关闭

开始啃 Erlang 程序设计,第二口

131人阅读 评论(0) 收藏 举报
分类:

Erlang 速览,既走马观花式的看看大概

本章要达到的学习目标:老Joe的要求是理解如何运行代码和编译模块,这两点,当然我得再掏出更多相关信息。并通过一个文件服务器的例子展示用Erlang 写多进程程序的优越性。反正确实比C++/C#/Java要方便很多。

                          1.如何运行代码

                          2.编译模块

2.1 Erlang Shell

        linux shell 下输入 erl 既进入 erlang shell  交互式会话中,它支持一种称为 REPL 方式来学习 erlang.

书上说请注意,每一条表达式,都必须以一个句号后接一个空白符结尾。我打了句号直接回车也行。

help(). 查看 erlang shell 中所有能输入的与 shell 相关的命令。

2.2 进程,模块和编译

模块是代码的容器,有两种形式,给人操作的源代码形式,给EVM操作的 抽象码形式。 源代码 --- erlc ---> 抽象码。

模块与进程的关系,就像类与对象的关系。一个是死的一个是活的。我觉得模块主要占内存,进程主要占CPU,两个占的系统资源不同。

进程负责执行模块里的函数。在 erlang shell里执行的情况与在 erlang shell外执行的情况不一样,看我写的第一篇,hello,erlang.

在 erlang shell外运行编译器,是编译erlang代码的首选方式, 因为可以利用 工程构建工具,使用项目自动化构建出来。书上说高级用户喜欢自动编译,对Erlang shell 的使用也会变少。那我得一开始从高手开始。

2.3 你好,并发

用于进程的代码包含在模块里,要创建一个进程, 需要调用spawn,创建进程。Erlang对代码采用一种所谓“尾递归”的优化,意思是此函数的运行空间是固定的。

------- file_server -------

receive 

{Client, list_dir} -> Client ! {erlang:self(), file:list_dir(Dir)};

{Client, {get_file, File}} -> Full = filename:join(Dir, File), Client ! {erlang:self(), file:read_dir(Full)}

end,

这段代码很紧凑,所以很容易忽略所发生的细节。(我反复读了10遍,确实没有多余的部分),抽象的很高的语言。

这段代码有三个要点:1.回复给谁 2. self()的用法 3.模式匹配被用于选择消息

Erlang编译器和运行时会正确推断出如何在收到消息时运行适当的代码。不需要编写任何的 if-then-else或 switch代码来设定该做什么, 这是模式匹配带来的乐趣之一,会为你节省大量工作。c(file_server).后 beam 载入EVM,就等待什么时候被其它进程调用,或自己 spawn 一个进程调用啦。同一个beam 可以 spawn N个进程出来,只要内存够大。

2.3.2 客户端代码

用一个 file_client模块来访问 file_server模块, 这个模块的主要目的是为了隐藏底层通信协议的细节。客户端代码可以通过调用此客户端模块导出的 ls, get_file 函数来传输文件。

------------ file_client.erl -----------------------------

-module(file_client).

-export([ls/1, get_file/1]). % 提供 2个 API供其它地方调用

% 一定要有这个 Server 参数,不然不知道要向哪个进程发消息,这个Server 就是 服务器的PID,向这个进程发消息,才有反应。

ls(Server) ->   %  一个用户接口

Server ! {erlang:self(), list_dir},   % 一定要先发个消息过反,服务器进程收到后匹配上了消息才能回过来,相当于一个激活过程。

receive 

{Server, FileList} -> FileList

end.

get_file(Server, File) -> % 第二个用户接口,第一步也是先要向 服务器进程发个消息,然后再处理接收的消息

Server ! {erlang:self(), {get_file, File}} ->

receive

{Server, Content} -> Content

end.

从Erlang角度看, 如何启动和停止服务器,连接套接字, 从错误中恢复等都是琐碎的细节(以后学到OTP框架自己都处理)。

而问题本质在创建并行进程 ,以及发送和接收消息。

在Erlang里用进程来构建问题的解决方案。思考进程的结构(也就是说哪些进程间相互有关联系),思考进程间传递的消息以及消息包含何种信息是思考和编程方式的中心。


   



0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1916次
    • 积分:86
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档