初次使用erlang的concurrent
如果不是它骇人听闻的并行性能,几乎不会考虑去学习这么一门语言。因为它的并行,我看到的是一块用软件写出来的电路板,是的,它几乎就是把电脑变成了一个可以自由编写逻辑的芯片。
例程来自这里: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的更多相关文章
- Concurrent.Thread.js
(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...
- Erlang Concurrent 并发进阶
写在前面的话 本文来源于官方教程 Erlang -- Concurrent Programming.虽然没有逻辑上的关系,但建议在掌握了Erlang入门系列教程的一些前置知识后继续阅读. 之前我是逐小 ...
- erlang和java的socket通讯----最简单,初次实现。
直接上源码,留做纪念. 有点简单,大家不要笑,初次实现. 功能描述:java发送数据给erlang,erlang将收到的数据重复两次再发送给java. erlang源码:模块tcp_listen -m ...
- [Erlang 0129] Erlang 杂记 VI
把之前阅读资料的时候记下的东西,整理了一下. Adding special-purpose processor support to the Erlang VM P23 简单介绍了Erlang C ...
- [Erlang 0126] 我们读过的Erlang论文
我在Erlang Resources 豆瓣小站上发起了一个征集活动 [链接] ,"[征集] 我们读过的Erlang论文",希望大家来参加.发起这样一个活动的目的是因为Erlang相 ...
- [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集
Erlang Resources 小站 2013年7月~12月资讯合集,方便检索. 附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集 小站地 ...
- [Erlang 0105] Erlang Resources 小站 2013年1月~6月资讯合集
很多事情要做,一件一件来; Erlang Resources 小站 2013年1月~6月资讯合集,方便检索. 小站地址: http://site.douban.com/204209/ ...
- [Erlang 0108] Elixir 入门
Erlang Resources里面关于Elixir的资料越来越多,加上Joe Armstrong的这篇文章,对Elixir的兴趣也越来越浓厚,投入零散时间学习了一下.零零散散,测试代码写了一些,Ev ...
- Erlang Materials Outline
Motivation 因The Erlang Run-Time System迟迟没有出版,不等了. 梳理一下学习Erlang过程中的学习笔记,以准备一个关于Erlang的small but tight ...
随机推荐
- java 21 - 6 字符缓冲流的特殊方法以及该方法高效复制文件
字符缓冲流的特殊方法: A.BufferedWriter: public void newLine():根据系统来决定换行符 private static void write() throws IO ...
- java 20 - 8 字节流的文件复制以及汉字在计算机中的存储方式
复制文本文件:把当前目录下的FileIntputStream.java文件里面的内容复制到当前目录的b.txt文件中 分析: 数据源: FileIntputStream.java -- 读取数据 -- ...
- javascript单元测试工具
单元测试关注的是验证一个模块或一段代码的执行效果是否和设计或预期一样.有些开发人员认为,编写测试用例浪费时间而宁愿去编写新的模块.然而,在处理大型应用程序时,单元测试实际上会节省时间:它能帮助您跟踪问 ...
- 21SpringMvc_异步发送表单数据到Bean,并响应JSON文本返回(这篇可能是最重要的一篇了)
这篇文章实现三个功能:1.在jsp页面点击一个按钮,然后跳转到Action,在Action中把Emp(int id ,String salary,Data data)这个实体变成JSON格式返回到页面 ...
- C语言 百炼成钢7
//题目19:一个数如果恰好等于它的因子之和,这个数就称为“完数”.例如6=1+2+3.编程找出1000以内的所有完数. #define _CRT_SECURE_NO_WARNINGS #includ ...
- C# 与 LUA 的经验对比
1,字符串遍历不同处:例: str = "汉字ABCabc"C#可以使用str[i]取得字符串中的汉字字符和拼音字符:Str[0] :汉Str[1]:字Str[2] : A依次类推 ...
- Windows下MemCache多端口安装配置
Windows下MemCache环境安装配置的文章很多,但大部分都是用的默认端口11211,如何修改默认端口.如何在一台服务器上配置多个MemCache端口?这正式本文要解决的问题. 1.从微软官网下 ...
- python 调用 shell 命令方法
python调用shell命令方法 1.os.system(cmd) 缺点:不能获取返回值 2.os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 ...
- window8配置IIS,搭建应用程序网站。
这个里面的一定要勾选,不然会有莫名其妙的错误. 在应用程序池中,如果你是64位电脑,需勾选启用32位应用程序为 true
- Itextsharp下根据Echarts图像生成pdf
本文介绍如何在C#中使用ItextSharp生成带echarts图表的pdf 一.生成一个简单的pdf 后台代码 publicActionResultGetPdf() { MemoryStream m ...