erlang学习记录(二)进程

栏目: Erlang · 发布时间: 1年前

来源: segmentfault.com

内容简介:erlang进程与操作系统进程不同,erlang进程的切换、生成和消息传递是由erlang虚拟机管理的。是erlang 并发单元的一个代称。 每个进程代表一个持续的活动,执行某一段代码。在执行完毕后自动退出。erlang进程的创建由第二种方法要求给定的函数必须事先从模块中导出,并且初始数据只能由参数列表传入。同时,

本文转载自:https://segmentfault.com/a/1190000018670648,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有。

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链接起来。

监视进程

链接的替代品。一种单向链接。由一下几种函数完成

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

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

退出进程

1、抛出异常终结进程。

exit(Reason)

除非被进程捕获,否则该调用将令进程停止,并将 Reason 作为退出信号的一部分发送给所有与该进程相链接的进程。

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

exit(Pid,Reason)

该信号终止的是接收方。发送该信号时,收发双方无需链接。

如果 Reason 是原子 kill ,则接受方无法捕捉该信号,会被强制终止。

3、设置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 .匿名函数必须与变量绑定,或者作为参数传递给其他函数,或者作为函数返回值。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

关注码农网公众号

关注我们,获取更多IT资讯^_^


查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

流畅的Python

流畅的Python

[巴西] Luciano Ramalho / 安道、吴珂 / 人民邮电出版社 / 2017-5-15 / 139元

【技术大咖推荐】 “很荣幸担任这本优秀图书的技术审校。这本书能帮助很多中级Python程序员掌握这门语言,我也从中学到了相当多的知识!”——Alex Martelli,Python软件基金会成员 “对于想要扩充知识的中级和高级Python程序员来说,这本书是充满了实用编程技巧的宝藏。”——Daniel Greenfeld和Audrey Roy Greenfeld,Two Scoops ......一起来看看 《流畅的Python》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试