在前两个blog中,已经说了Erlang的历史、应用场景、特点,这次主要演示一个Wordcount的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数。

今天和群友们讨论了一个问题,突然一下子就上升到哲学角度上了,装逼装大发了。

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",大概是这样的效果:

Erlang基础 -- 介绍 -- Wordcount示例演示

简要设计

基本流程设计大概是这样的

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                           <<",">>, <<":">>, <<"--">>]).
View Code

相关文章:

  • 2021-07-04
  • 2022-12-23
  • 2021-11-28
  • 2021-07-18
  • 2021-08-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-06-11
  • 2021-06-23
  • 2021-04-12
  • 2021-06-26
  • 2021-05-03
相关资源
相似解决方案