在前两个blog中,已经说了Erlang的历史、应用场景、特点,这次主要演示一个Wordcount的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数。
今天和群友们讨论了一个问题,突然一下子就上升到哲学角度上了,装逼装大发了。
PS:图片中有错别字,%s/财务和其他9个月/财务和其他9个人/g
不过真心想说的一点是,把Erlang系统,映射到现实中,很多奇葩问题,就能迎刃而解了。所以,在下面的简要设计中,我就尽可能的代入一下现实世界吧。
环境安装
mac 的话,用brew就行了:
brew install erlang
centos 用yum:
yum install erlang
Ubuntu 用apt-get:
apt-get install erlang
源码安装:
$ tar -zxf otp_src_17.4.tar.gz (官网上下载源码)
cd otp_src_17.4
./configure && make -j && make install
注意,确保OpenSSL依赖库已经安装成功,建议安装wxWidgets库。
安装好之后,在控制台terminal下输入"erl",大概是这样的效果:
简要设计
基本流程设计大概是这样的
1,使用本地计算机的多个终端模拟多个Erlang节点
2,使用一个Erlang进程作为主进程,并且按行读取文本文件(这种读取方式不见得是最好的,后续会细说)
3,主进程按照每行创建一个Erlang进程作为逻辑处理进程
4,逻辑处理进程进行实际的逻辑执行并将处理结果发送给主进程
5,主进程进行汇总并显示一定数量的单词以及该单词出现的次数
|---------------------------------------------------------------------------------------------------------------
| 映射到现实世界中,怎么讲?
| 1,team leader拆分项目需求点
| 2,leader按照每个需求点指派给一个team member
| 3,team member搞定各自的需求点并将结果告知leader
| 4,team leader汇总member的结果并项目结项
|---------------------------------------很自然的现实映射------------------------------------------------------
那那那,注意了,每个逻辑处理进程是可以分布在不同的Erlang节点上的,换言之,如果是在实际的环境中,逻辑处理进程是可以分布在不同的物理机器上。
对于主进程而言,主要做的事情包括:
1,按行读取文本文件
2,创建逻辑处理进程
3,等待逻辑进程的结果返回
4,结果都返回之后,进行汇总并显示最终处理结果
对于逻辑处理进程而言,需要做的事情有:
1,按照指定的字符来切割主进程发送的文本
2,按照单词进行初步的计算和汇总
3,将处理结果发送给主进程
注意注意注意,主进程和逻辑处理进程之间的任务分派,结果传递,都是使用“消息通信的方式”,映射到现实生活中,也很好理解,team leader和team member之间进行沟通就是用说话的方式,人和人之间无法共享彼此的记忆。
简要代码分析
代码分析的目的是为了说明Erlang的方便性,看不太懂代码的同学不用着急,后面的blog会一点一点慢慢解释的。
主体代码就80多行的代码。
首先模块的头部:
1 -module(wordcount). 2 3 -include_lib("stdlib/include/ms_transform.hrl"). 4 5 -export([start/2]). 6 -export([worker_execute/3]). 7 -export([insert_main_ets_table/2]). 8 9 -define(BUFSIZE, 1048576). 10 -define(FILEMODE, [binary, read, {read_ahead, ?BUFSIZE}]). 11 -define(SPLIT_CHAR_LIST, [<<"\n">>, <<" ">>, <<"\"">>, 12 <<"!">>, <<"&">>, <<".">>, 13 <<",">>, <<":">>, <<"--">>]).