Fork me on GitHub
随笔 - 215  文章 - 13  trackbacks - 0
<2018年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345


专注即时通讯及网游服务端编程
------------------------------------
Openresty 官方模块
Openresty 标准模块(Opm)
Openresty 三方模块
------------------------------------
本博收藏大部分文章为转载,并在文章开头给出了原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!如为您带来不便,请于本博下留言,谢谢配合。

常用链接

留言簿(1)

随笔分类

随笔档案

相册

Awesome

Blog

Book

GitHub

Link

搜索

  •  

积分与排名

  • 积分 - 206965
  • 排名 - 122

最新评论

阅读排行榜

节选自:https://www.sohu.com/a/244980510_473282


Erlang 的世界和我们的真实世界很像。每个 Erlang 进程维护着自己独有的内存,别的进程无法访问其内部状态,除非它们互发消息进行交流。所有的消息传递都是异步的,就像我们的现实世界。

1>spawn(foo,hello,[]).

<0.70.0>

这样就会创建一个新的进程,调用foo:hello()。进程一旦执行完这个函数就会死掉,将所有分配到的内存还给BEAM。

如果你想创建两个进程同时做事,只需spawn两次:

1>spawn(foo,hello,[]).

<0.70.0>

2>spawn(foo,hello,[]).

<0.71.0>

这将创建两个进程并发调用foo:hello()。这就是 Erlang 的并发模型——也叫参与者模式 (Actor model)。

如果你想整100个进程同时做事,调用spawn 100次即可。简单粗暴。

现在我们知道如何创建进程,接下来是给它发消息。

1>Pid=spawn(foo,loop,[]).

<0.80.0>

2>Pid!hello.

hello

这里我们启动一个进程调用 foo:loop()。我们假设这个loop函数会递归调用自己,这样我们的进程不会一下就死掉。spawn 会返回一个进程ID <0.80.0>,我们将其绑定到 Pid 变量中,并向其发个消息 hello。 Erlang 里用惊叹号 ! 发消息。好了,以上就是异步消息发送。这也是 Erlang 中两个进程之间交流的唯一手段。

当消息被发给某进程后,该进程如何收消息呢?

1>Pid=spawn(fun()->

1>receive

1>hello->io:format("Got hello message~n")

1>end

1>end).<0.86.0>

2>Pid!hello.

Gothellomessage

hello

用 receive 来收消息。你可以在这里用模式匹配来匹配你想要接收的信息,忽略其他的消息。在这个例子中,我们只接收消息 hello。

我们平时会记不住朋友的电话,所以我们用通讯录给电话号码加个名字。在 Erlang 中也没有必要记住每个进程的 Pid,给其注册个名字即可以后用名字来访问之。

1>Pid=spawn(fun()->receivehello->io:format("Got hello message~n")endend).

<0.93.0>

2>register(foo,Pid).

true

3>foo!hello.

Gothellomessage

hello

只需调用 register(Name,Pid) 即可给任何进程注册名字。之后我们可以用该名字给进程发消息。

当我们给某进程注册了名字后,我们也能通过查找通讯录来找到其Pid。

1>register(foo,spawn(fun()->receivehello->helloendend)).

true

2>whereis(foo).

<0.102.0>

最后,一个进程可以通过调用 self() 来找到自己的Pid。

1>self().

<0.90.0>

以上6个函数就这么简单,再多也没有了。spawn, send, receive, register, whereis 和 self。就这6个函数,组成 Erlang 的世界观。

posted on 2018-12-13 10:22 思月行云 阅读(596) 评论(0)  编辑 收藏 引用 所属分类: Erlang

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理