如果不是它骇人听闻的并行性能,几乎不会考虑去学习这么一门语言。因为它的并行,我看到的是一块用软件写出来的电路板,是的,它几乎就是把电脑变成了一个可以自由编写逻辑的芯片。

例程来自这里:http://www.erlang.org/doc/getting_started/conc_prog.html

例1 体会concurrent

-module(tut14).

-export([start/0, say_something/2]).

say_something(What, 0) ->
done;
say_something(What, Times) ->
io:format("~p~n", [What]),
say_something(What, Times - 1). start() ->
spawn(tut14, say_something, [hello, 3]),
spawn(tut14, say_something, [goodbye, 3]).

我们看到,除了最后两行,这其实和我们前面学到的没什么两样。。。最后两行出现了一个新鲜的BIF,spawn(),他有三个参数:

1. 参数2所在的模块名

2. 启动新进程后,执行哪个函数

3. 要传递给参数2的参数

两个spawn()事实上只启用了一个新的进程,一个用来执行say_something(hello, 3),一个用来执行say_something(goodbye, 3)。当然,他们是在同时执行的:

> c(tut14).
{ok,tut14}
> tut14:say_something(hello, 3).
hello
hello
hello
done
> tut14:start().
hello
goodbye
<0.39.0>
hello
goodbye
hello
goodbye

例2 发送和接收消息

通常意义上大家认为进程是独立运行的,不共享任何资源;而线程是需要共享资源的。我们不共享资源,所以把这里并行的叫做进程。但是,既然不共享资源,那该如何进行进程间通信呢?事实上,机制是唯一的:消息。我们可以根据进程的pid来发送消息,比如上面的<0.39.0>就是进程的pid。

-module(tut15).
-export([start/0, ping/2, pong/0]). ping(0, Pong_PID) ->
Pong_PID ! finished,
io:format("ping finished~n", []); ping(N, Pong_PID) ->
Pong_PID ! {ping, self()},
receive
pong ->
io:format("Ping received pong~n", [])
end,
ping(N - 1, Pong_PID). pong() ->
receive
finished ->
io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
pong()
end. start() ->
Pong_PID = spawn(tut15, pong, []),
spawn(tut15, ping, [3, Pong_PID]).

上面的代码里出现了两个生面孔:

1、Pong_PID ! finished。这就是前面提到的发送message。

2、receive...end。这句则是用来接收message;如pong()中的finished和{ping, Ping_PID}则是两项匹配条件,表示如果接收到的消息是这个或者那个,然后如何如何。如果接收到的消息是finished,那么在io中输出,pongfinished。

3、Pong_PID是由spawn返回的,而Ping_PID则是调用self()函数获取的。

执行的结果是:

> c("tut15").
{ok,tut15}
> tut15:
module_info/0 module_info/1 ping/2 pong/0 start/0 > tut15:start().
Pong received ping
<0.47.0>
Ping received pong
Pong received ping
Ping received pong
Pong received ping
Ping received pong
ping finished
Pong finished

初次之外,还有一个“别名”机制,我们使用register,来给进程起个名字,这样我们在发消息的时候,就不再是依据PID,使用名字就可以了。我们还是使用上面的例子,只是引入了register,而不再用Pong_PID:

-module(tut15).

-export([start/0, ping/1, pong/0]).

ping(0) ->
pong ! finished,
io:format("ping finished~n", []);
... start() ->
register(pong, spawn(tut15, pong, [])),
spawn(tut15, ping, [3]).

如上:register(some_atom, Pid),第一个参数是一个Atom,第二个参数是spawn返回来的进程id。

窥一斑而知全豹。

初次使用erlang的concurrent的更多相关文章

  1. Concurrent.Thread.js

    (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...

  2. Erlang Concurrent 并发进阶

    写在前面的话 本文来源于官方教程 Erlang -- Concurrent Programming.虽然没有逻辑上的关系,但建议在掌握了Erlang入门系列教程的一些前置知识后继续阅读. 之前我是逐小 ...

  3. erlang和java的socket通讯----最简单,初次实现。

    直接上源码,留做纪念. 有点简单,大家不要笑,初次实现. 功能描述:java发送数据给erlang,erlang将收到的数据重复两次再发送给java. erlang源码:模块tcp_listen -m ...

  4. [Erlang 0129] Erlang 杂记 VI

    把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM   P23 简单介绍了Erlang C ...

  5. [Erlang 0126] 我们读过的Erlang论文

    我在Erlang Resources 豆瓣小站上发起了一个征集活动 [链接] ,"[征集] 我们读过的Erlang论文",希望大家来参加.发起这样一个活动的目的是因为Erlang相 ...

  6. [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集

    Erlang Resources 小站 2013年7月~12月资讯合集,方便检索.     附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集    小站地 ...

  7. [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集

    很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索.      小站地址: http://site.douban.com/204209/     ...

  8. [Erlang 0108] Elixir 入门

    Erlang Resources里面关于Elixir的资料越来越多,加上Joe Armstrong的这篇文章,对Elixir的兴趣也越来越浓厚,投入零散时间学习了一下.零零散散,测试代码写了一些,Ev ...

  9. Erlang Materials Outline

    Motivation 因The Erlang Run-Time System迟迟没有出版,不等了. 梳理一下学习Erlang过程中的学习笔记,以准备一个关于Erlang的small but tight ...

随机推荐

  1. 会报编译器警告的Xcode 6.3新特性:Nullability Annotations

    最近在用Xcode 6.3写代码,一些涉及到对象的代码会报如下编译器警告: 1 Pointer is missing a nullability type specifier (__nonnull o ...

  2. 十一、常用的NSArray和NSMutableArray方法

    1.概念 用来存储OBJ对象的有序列表,它是不可变的 2.创建常用方法 + (id)array + (id)arrayWithObect:(id)anObject + (id)arrayWithObe ...

  3. jquery中$("#afui").get(0)为什么要加get(0)呢?

    jquery中$("#afui").get(0)为什么要加get(0)呢? 2015-04-13 17:46SYYZZ3 | 浏览 509 次  Jquery $("#a ...

  4. 【Mysql】日期时间格式化

    1.日期转成指定格式:DATE_FORMAT(date, format) 2.int型时间转成指定格式:FROM_UNIXTIME(unix_timestamp,format) 根据format字符串 ...

  5. web页面的回流,认识与避免

    一.什么是回流? 回流是会导致页面重新渲染的一些元素,从而影响性能. 二.哪些因素会导致回流? 1.调整窗口的大小: 2.改变字体,如果用rem  设置了根目录的字体大小,这样就减少了回流的次数: 3 ...

  6. Python基础 - 获取N天前的日期

    获取今天前第N天的日期 from datetime import datetime from datetime import timedelta def get_date(days=N): retur ...

  7. 关于浏览器cookie的那些事儿

    昨天接到一个小需求,就是在ipad上访问某页面,页面顶部出现一个下载客户端的提示,点击关闭按钮后,提示信息消失,信息存入cookie,在cookie未过期之前,除非用户自己清除浏览器的cookie,否 ...

  8. 20145222黄亚奇《Java程序设计》第4周学习总结

    教材学习内容总结 第6章 为了避免重复的行为定义使用继承. 要学会如何正确判断使用继承的时机以及继承之后如何活用多态. 继承的好处之一,就是若你要将name.lexel.blood改为其他名称,那就只 ...

  9. EF实体框架之CodeFirst四

    在EF实体框架之CodeFirst二中也提到数据库里面一般包括表.列.约束.主外键.级联操作.实体关系(E-R图).存储过程.视图.锁.事务.数据库结构更新等.前面几篇博客把表.存储过程.视图这些算是 ...

  10. 端口扫描之王——nmap入门精讲(二)

    接着讲上节的内容,上节中提到了一个时间优化的问题是使用参数-n,通过不解析地址来进行优化时间的,但是优化时间的方法还有很多,比如说我们可以通过时间优化(0-5),指定单位时间内的探针数,设置组的大小 ...