ArcBlock 课堂 ⑨ | Erlang 123(全程视频 + 文字)

14 日上午 9:00(美国太平洋时间 13 日下午 5:00),ArcBlock Technical Learning Series 第八期“Erlang 123”, 由 ArcBlock 后端工程师 孙博山 讲授。

# 讲座全程视频

# 讲座全程文字:

之前在程序人生公众号撰写过一篇小文Erlang入坑指南,文中以6个Erlang函数介绍了一下Erlang的世界观。在ArcBlock,我们后端服务用Elixir打造。既然都用Elixir了,自然会涉及到Erlang。这篇博文是基于我们的Technical Learning Series技术培训,用3个Erlang函数带您认识Erlang的世界观。

我们的世界

我们所生活的世界是一个并行的世界。人类总体构成一个社会,同时我们每个人也是独立的个体。每个个体都有差异,我们都有自己独立的思想,并且我和你之间不会共享记忆。举个例子,虽然新郎新娘一起经历了结婚这件事,但是在新郎的记忆里面存着的是新郎的角度经历的婚礼,新娘的记忆存的是以新娘的角度经历的婚礼。新郎新娘各有一个婚礼的记忆拷贝,但是他们之间却不共享任何记忆。

同时,人与人之间的交流完全是异步进行的。我给你发了个微信之后会继续刷我的朋友圈,你收到信息也不一定立即回复,信息的传递是完全异步进行的。所谓的同步信息传递,比如打电话,也只是我们人为地约定俗成你说一句话,然后我说一句话来进行交流。我完全可以不等你说话而自顾自地说,这时候你会觉得我没有礼貌,但是信息传递的本质其实还是异步传递。

编程语言

自从有了计算机,我们有了编程语言,目的是为了让我们可以通过编程语言来告诉计算机做什么。一开始我们用汇编语言直接告诉计算机做什么,但是这很麻烦,所以我们发明了高等程序语言,用我们人类能理解的方式写代码,然后编译器翻译成机器语言去执行相应的命令。我们在学校所接触到的大部分高等语言都是面向对象的,面向对象的语言尝试用对象来模拟我们的真实世界,对象源于类。比如,桌上的水杯是一个水杯类的实体,该类有属性比如水杯容量,该类有方法比如接水倒水。这是很不错的模拟现实世界的方式,但是面向对象语言最大的问题就是找不到对象。

Erlang则尝试从另一个角度来模拟我们的真实世界,那就是用进程。每个进程都是独立个体,有自己的状态,互相之间不共享任何信息,进程之间的唯一通信手段就是异步消息传递。在Erlang的世界里面没有类和对象,有的只是一个个进程。Erlang的这种对世界的模拟方法和我们平时所生活的真实世界其实很像,所以理解Erlang的世界观反而会更加自然直观。接下来我们看看Erlang的世界观用代码写出来是什么样的。

hello world

先看最简单的hello world长什么样。

-module(foo).-export([hello/0]).hello() ->    io:format("world~n").

在终端运行一下

$ erl
1> c(foo),foo:hello().    % c(foo)用来对foo模块进行编译生成目标文件.beam
                          % 每次进行改动后都要重新编译加载最新的目标文件
world
ok

接下来我们在调用io:format/1之前加一个等待函数等待一秒钟

hello() ->
    timer:sleep(1000),    % 1000毫秒为1秒钟
    io:format("world~n").

再次在终端调用

2> c(foo),foo:hello().
world                     % 1秒后打印出来
ok

如果我们调用3次,则会花3秒钟

3> foo:hello(),foo:hello(),foo:hello().
world                     % 1秒后打印出来
world                     % 2秒后打印出来
world                     % 3秒后打印出来
ok

spawn

现在我们来看今天要讲的第一个函数spawn/3。这个函数会启动一个进程,该进程会执行一个函数。

4> spawn(foo,hello,[]).   % 传入的三个参数分别是模块名、函数名和函数参数
                          % hello函数没有参数,所以第三个参数我们传入[]表示空
<0.105.0>                 % 返回的这个东西叫pid,表示进程的id(process id)
world                     % 1秒后打印出来

如果我们调用三次,看看会发生什么

5> spawn(foo,hello,[]),spawn(foo,hello,[]),spawn(foo,hello,[]).
<0.111.0>                 % 返回一个pid
world
world
world                     % 1秒后同时打印出来3个信息

也就是说,我们通过调用spawn/3三次开启了三个进程,每个进程等待一秒后打印信息,所以三条信息同时被打印出来。这就是并发。

所以在Erlang里面并发的概念极其简单,就是调用spawn函数即可。要同时有100个进程并发做事,只需调用spawn100次。简单粗暴。

send

一个进程被启动后会有一个pid,我们可以通过该pid往进程发消息。这就好像我们可以通过电话号码给某人打电话一样。事实上当我们启动一个Erlang shell的时候,shell本身也是一个进程,我们可以给自己发条消息。

6> self() ! 1.                        % self()会返回自己的pid,用惊叹号表示发送消息
1
7> process_info(self(),messages).     % 我们可以检查一下自己的邮箱里面的消息
{messages,[1]}                        % 可以看到刚才发送的1已经在邮件里面了

以上就是异步发送,是Erlang里面进程交流的唯一手段。

receive

如何收取在邮箱中的消息呢?用receive函数

8> receive Msg -> Msg end.
1

好了,以上就是今天要讲的3个函数。虽然很简单,但是却构建出了Erlang的世界观:该世界由进程组成,进程之间不共享任何信息,进程之间靠异步消息传递作为唯一通信手段。

Erlang能做什么?

知道这三个函数了,接下来呢?Erlang能用来做什么呢?我们把刚才的hello/0函数稍作修改如下:

hello() ->
    receive
        {Msg,From} ->                            % 对于任何长成{Msg,From}的信息
            io:format("~p: ~p~n",[From,Msg]),    % 我们将其打印出来
            hello()
    end.

我们重新开一个终端,这次带点参数

$ erl -sname a                                   % -sname 可以起个名字
(a@sbs)1> c(foo),P = spawn(foo,hello,[]).        % sbs是我的机器名,a是这个Erlang节点的名字
<0.107.0>                                        % 他们共同组成我这个Erlang节点的名字a@sbs
(a@sbs)2> register(a,P).                         % 我们为其注册一个名字a
true
(a@sbs)3> a ! {1,node()}.                        % 我们可以给a这个名字发消息, node()会返回我们节点名字
a@sbs: 1                                         % 当进程收到该消息时将其打印出来
{1,a@sbs}

再开一个终端,起名为b

$ erl -sname b
(b@sbs)1> a ! {1,node()}                         % 我们往a这个名字发条消息
** exception error: bad argument                 % 结果出错,因为在b@sbs这个节点中并没有叫a的进程
     in operator  !/2
        called as a ! {1,b@sbs}
(b@sbs)4> {a,a@sbs} ! {1,node()}.                % 因为叫a的进程在a@sbs里面,所以我们试着往a@sbs
{1,b@sbs}                                        % 节点中发消息

这时我们看到在b节点中,消息并没有被打印出来,但是我们再看一下a节点的终端窗口

b@sbs: 1                                         % 消息在a的终端窗口被打印出来了
(a@sbs)4>

短短几行代码,我们实现了一个最简单的聊天程序。原理其实非常简单,就是往某个节点的某个进程发消息,该进程收到消息后将其打印。Erlang的简洁之处在于,从语言层面来说,开发者无需关心底层的通讯协议,只需关心把什么消息发送到什么地方,以及收到消息后要如何处理该消息。

有兴趣用Erlang/Elixir打造区块链项目的小伙伴们,请发简历到 career@arcblock.io 加入我们吧。

主 讲

孙 博 山

ArcBlock 软件工程师

●  毕业于北航软件学院 最擅长的语言是中文和Erlang

●  拜师Erlang之父Joe Armstrong本人 得秘传二郎宝典一本

●  曾在Code BEAM SF担任讲员

●  喜爱思考事物的本质 偶像是一名厨子

ArcBlock Technical Learning Series 第九期

Elixir Test

11 月 21 日周三上午 9 时(美国太平洋时间 20 日下午 5 时),区块基石技术培训讲座第九期 Elixir Test,由数据工程师 Taotao 讲授。

报名听课,登录官网注册:

https://hack.arcblock.io/learning/

或登陆掘金注册:

https://juejin.im/events/all

或扫码注册:

ArcBlock 课堂 ① | Intro to GraphQL and Absinthe

ArcBlock 课堂 ② | Intro to Ethereum Smart Contract

ArcBlock 课堂 ③ | Intro to AWS Data Pipeline Services

ArcBlock 课堂 ④ | Intro to AWS Athena

ArcBlock 课堂 ⑤ | What is AWS Kinesis

ArcBlock 课堂 ⑥ | 多步验证那些事 (全程视频 + 文字)

ArcBlock 课堂 ⑦ | Intro to CQRS and Commanded(全程视频 + 文字)

ArcBlock 课堂 ⑧ | Tendermint: Consensus Made Easy(全程视频 )

相关阅读:

ArcBlock 课堂预告 | 是的,我们将开放大部分技术讲座

ArcBlock 课堂 ① | Intro to GraphQL and Absinthe

ArcBlock 课堂 ② | Intro to Ethereum Smart Contract

ArcBlock 课堂 ③ | Intro to AWS Data Pipeline Services

ArcBlock 课堂 ④ | Intro to AWS Athena

ArcBlock 课堂 ⑤ | What is AWS Kinesis

ArcBlock 课堂 ⑥ | 多步验证那些事 (全程视频 + 文字)

ArcBlock 课堂 ⑦ | Intro to CQRS and Commanded(全程视频 + 文字)

ArcBlock 课堂 ⑧ | Tendermint: Consensus Made Easy(全程视频 )

ArcBlock 博客 | 北京黑客马拉松小记

ArcBlock 黑客松 ③ | 360分钟11 个DApp 北京黑客创意令人大开眼界

ArcBlock 北京黑客松,你来不来?

ArcBlock 黑客松 ② | 新 SDK 亮相 黑客应用质量更高

ArcBlock 活动 | 首场内测版黑客马拉松成功举行

ArcBlock 博客 | Exchange 服务的工作流程以及如何集成到 OCAP 服务

ArcBlock 博客 | OCAP超简易集成攻略(Android 篇)

ArcBlock 博客 | OCAP 超简易集成攻略( iOS 版篇)

ArcBlock 博客 | 浅析数据对区块链行业发展的重要性

ArcBlock 博客 | 开放链访问协议为何采用 GraphQL

ArcBlock 博客 | 如何解析 BITCOIN 的数据

ArcBlock 博客 | 30 天 21 个版本 OCAP Playground 都经历了哪些变化?

ArcBlock 博客 | 如何在几十个 Repo 中游刃有余?

ArcBlock 博客 | OCAP Playground 入门指南

ArcBlock 分享 | 冒志鸿:公链性能焦虑是被EOS忽悠了

ArcBlock 分享 | 冒志鸿:从互联网、移动互联网到区块链,20年方法论总结

ArcBlock 分享 | 从OCAP到Blocklet,为传统开发者打开迈向区块链的大门

ArcBlock 分享 | OCAP Playground让区块链开发变得更友好

更多ArcBlock区块基石信息,可关注以下渠道了解: 

  • Twitter | https://twitter.com/ArcBlock_io

  • Instagram | https://www.instagram.com/arcblock/

  • Facebook | https://www.facebook.com/arcblock.io/

  • Telegram | https://t.me/ArcBlock

  • LinkedIn | https://www.linkedin.com/company/18355951/

  • Reddit | https://www.reddit.com/r/arcblock/

  • Medium | https://medium.com/arcblock

  • 微博 | https://weibo.com/realArcBlock

  • 微信群 | 加拉群小助手:Ddchain

  • 电报群 | Telegram groups:

    Telegram(English): https://t.me/ArcBlock

    Telegram(繁体中文): https://t.me/ArcblockAsian

↙ 点击登陆 报名听课

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值