erlang学习记录(二)进程

erlang进程

erlang进程与操做系统进程不一样,erlang进程的切换、生成和消息传递是由erlang虚拟机管理的。是erlang 并发单元的一个代称。 每一个进程表明一个持续的活动,执行某一段代码。在执行完毕后自动退出。闭包

建立、连接进程

erlang进程的建立由spawn()函数完成,spawn()经常使用的有如下两种形式。并发

  1. spawn(Fun()).
  2. spawn(Module,Function,ListOfArgs).
  3. spawn_link(Fun()).
  4. spawn_link(Module,Funtion,ListOfArgs).

第二种方法要求给定的函数必须事先从模块中导出,而且初始数据只能由参数列表传入。同时,第二种方法老是采用模块的最新版本。这些函数均返回新进程的Pid。spawn_link(...)将建立的进程与原进程连接起来,确保这两个操做为原子操做。函数

若是两个进程互相链接,则一个进程终止时会像另外一个进程发错误信号{'EXIT',Pid,Reason}
建立连接的函数为link(Pid),它将当前进程与Pid连接起来。spa

监视进程

连接的替代品。一种单向连接。由一下几种函数完成操作系统

  1. spawn_monitor(Fun()).
  2. spwan_monitor(Module,Function,ListOfArgs).

被监视的进程退出会发消息给监视进程,监视进程退出则对被监视进程无影响。pwa

退出进程

一、抛出异常终结进程。

exit(Reason)code

除非被进程捕获,不然该调用将令进程中止,并将Reason做为退出信号的一部分发送给全部与该进程相连接的进程。对象

二、直接向进程发送退出信号

exit(Pid,Reason) 进程

该信号终止的是接收方。发送该信号时,收发双方无需连接。
若是Reason是原子kill,则接受方没法捕捉该信号,会被强制终止。get

三、设置trap_exit标志

process_flag(trap_exit,true)

默认状况下,进程收到连接的其余进程的退出信号就会退出。设置trap_exit标志能够避免这种状况。设置该标志后,除了没法捕捉的信号外,其余的外来退出信息都会被转换成无害的消息。

进程间消息的传递

receive
    Pattern1 when Guard1 -> 
            %% do some thing
    Pattern2 when Guard2 -> 
            %% do some thing
    after Time ->
        %% do some thing
    end

上面代码中的关卡是为了提取部分信息,若是省略则会接受全部消息。
after段也是可选的,若是省略,receive永不超时。不然 Time必须是表示毫秒数的整数或原子infinity。若是Time为0。则receive永不阻塞,若是为infinity,则receive永不超时。

注册进程

register(name,Pid)

用于给进程绑定一个名字。方便对进程的操做。

消息投递与信号

进程间信息传递除了用消息投递符 ! 之外还有进程发出的退出信号和尝试连接两个进程时的连接请求

传递消息时,如下基本传递保障时对全部信号成立的

  1. 若是进程A向进程B前后发送了S1和S2。不管信号间隔由多久,这两个信号都将按照发送顺序到达。
  2. 尽力投递全部信号。

进程字典

进程自身状态的一部分,每一个进程都有一个私有的进程字典。这是一个能够用任何值做为键的简单哈希表,用于存储Erlang项。

经过内置函数put(key,value)get(key,value)能够从中存取项。

尽可能使用Ets表。不要使用进程字典 。

erlang fun函数

erlang将函数视为数据。将函数封装成数据的对象称为fun函数(C++中的lamada表达式或者闭包)

函数有命名函数和匿名函数

命名函数能够直接经过函数名调用,也能够用来给其余函数当参数。

匿名函数的形式为fun()-> end.匿名函数必须与变量绑定,或者做为参数传递给其余函数,或者做为函数返回值。

相关文章
相关标签/搜索