论坛首页 综合技术论坛

erlang-concurrency(初级)

浏览 2011 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-22   最后修改:2010-03-23
继上一篇《erlang(初级)》后,继续来一个erlang中比较优秀的特色:concurrency。

erlang中每一个thread的叫法是process,可能行为上更像进程吧。
语法
1,new一个process:spawn(module_name, exportFunction, argsList)。
  例如:spawn(tut, say_something, hello).
  其中tut是module的名字,say_something是tut中export的方法,atom类型的hello是方法say_something的参数。

2,process之间的通讯
  receive方法:接收消息的方法。每一个process都有自己的input queue。每次receive执行对queue中消息进行匹配接收,如果第一个消息匹配失败,则进行第二个消息匹配,直到匹配成功,如果所有都失败,则当前process将wait新的message进行匹配。receive语法:
receive
   pattern1 ->
       actions1;
   pattern2 ->
       actions2;
   ....
   patternN
       actionsN
end.

process之间消息可以是简单合法的erlang中的terms。比如list,tuple,integer,atom,pid等(pid就是process的ID,由spawn返回)。

Pid ! Message:
这是发送消息的方法。例如:PID ! hello.  PID01 ! {hello, self()} (其中self()方法返回的是当前process的pid)。

3,注册process
register(some_atom, Pid)。
例如:register(process2, spawn(tut, say_something, [hello]))。
然后就可以直接用process2代表spawn返回的pid。


分布式
首先,erlang对分布式的安全有鉴权。最简单的方法就是在每一台分布式环境下的机器中的home目录下放一个文件".erlang.cookie",当然,文件里的内容也要一样的。这里注意一下,所说得home目录并不是指运行erlang的根目录,在windows中通过path中的HOME环境变量来指定,在linux和unix中,cd所进入的目录就是home目录。
至于文件的内容嘛,根据官方文档描述,只是一个atom。例如:helloworld。可能是初衷于手机使用,校验简单节省资源的原因吧。

同一个IP domain,一个node启动erlang系统的命令:erl -sname node1
不同IP domain,则用-name代替 -sname
访问process:普通环境下直接访问process的ID即可。分布式下以这种方式访问:{registered_name,node_name}   例如:{process1, process1@node1}。

先写到这,累了,后续......
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics