1.erlang的进程拥有自己的工作内存空间和自己的信箱,其中信箱用来存放外来的消息.进程之间相互独立(隔离),互不直接影响,仅通过消息传递来"交流".
2.erlang的消息传递是:复制室消息传递.每条消息都对外界产生影响,同时也会通过给进程发送消息来影响他们.消息传递,意味着接收进程收到的是数据副本,如果要发送的数据非常庞大,则要考虑内存空间是否足够.
3.消息传递分为同步和异步方式,其中同步方式实际上听过异步方式实现(即,令接收方总是回传一个显式的回复).
4.进程崩溃,与之相连的所有普通进程都会被"波及"进而退出.如果想要使某个进程不被相连进程波及,可通过设置trap_exit进程标记,令进程不再服从外来退出新号,而是将其捕获.这类能捕获信号的进程也被称为"系统进程",这样一来,除了无法捕获信号(kill,即:exit(Pid,kill)的信号)以外,外来的退出信号,都会被转换成无害的消息.设置方式:在进程初始化时,在init函数中显示调用:process_flag(trap_exit, true)即可.
5.分层容错:通过分层讲将相关的子系统归属于同一个监督者(supervisor)的辖区之内.当进程出错之后,不会尝试修复,而是任其崩溃,监督者检测到进程崩溃之后,会将其下的进程按照重启规则重启以回退到预设的基准状态,从而使整个系统回到一个已知的基准点.
6.重启规则:
one_for_one:如果一个子进程停止,则只重启该进程
one_for_all:如果一个子进程停止,所有其他子进程也停止,然后所有进程重启
rest_for_one:如果一个子进程停止,则启动顺序中在它之后的所有其他子进程也停止,然后停止的这些进程重启
simple_one_for_one:一个简化的one_for_one supervisor,所有的子进程都是同样进程类型并且是动态添加的实例
最大重启次数:
init(...) ->
{ok, {{RestartStrategy, MaxR, MaxT}, [ChildSpec, ...]}}.
如果在MaxT秒内重启超过MaxR次,则监督进程会停止所有子进程及其自身.如果该监督者有更高层的监督者,则更高层的监督者会继续根据重启规则进行下一步行动.
7.erlang的垃圾回收机制:分带复制式垃圾回收器.每个进程使用的内存都是自己的,随进程的创建和结束而分配和释放.
8.erlang除法运算:
/:总是返回浮点数,4/2结果是2.0
整除运算: -15 div -4 结果是3 但是 -15 rem -4 结果 -3
9.原子一经创建,即使不再使用也不会销毁,除非重启系统.
10.++原理:
[1,2,3]++[4,5,6,7] 先是 [3|[4,5,6,7]] 然后 [2|[3,4,5,6,7]] 以此类推,最后是[1|[2,3,4,5,6,7]].++右侧的列表不会被修改(erlang不允许这类破坏性修改),它只是借由一个指针成为了新列表的一部分,因此,++操作不关心右侧列表长度.如前文所示,使用++时,就必须先找到左侧列表的末尾,在从后往前逐步完成新列表构造.也就是说,左侧列表长度决定了++运算符的耗时.
11.系统中的pid是每个进程的唯一标识符,但是当系统运行时间长到一定程度,前前后后创建进程总数过亿时,pid有可能会被重用.不过一般并不会造成什么影响.
12.注意严格列表([1,2,3,4],[1|[1,2,3])和非严格列表([1|oops],[1|2])之间的区别.
13.写代码时,应尽量使用try...catch...代替catch Expression这种写法.后者看似简单,确实我们难以甚至无法准确判断到底发生了什么以及如何进行后续处理.
14.应尽量使用列表速构,出效率因素外,它也是这类运算最紧凑和刻度的表达形式,比如:[{arena,H*W}||{rectangle,H,W}<-List,H*W>=10]:取出面积不小于10的长方形,并计算面积
15.位串中,整数默认是8比特位,转化为10进制是:255,如果整数的位数超出了最大空间,就会被截断,<<255,256,257>>就会变成<<255,0,1>>
16.B1 = <<1,2>>,B2 = <<3,4>>,因为默认情况下,B1和B2被当做整书,所以<<B1,B2>>行不通,会报错.但是如果指定B1和B2是位串,就可以,<<B1/bits,B2/bits>>.
17.位串速构和列表速构的区别:
<< <<X:8>> ||X <= <<41,203,23:5>> >>,[X*2||X<-[1,2,3,4,5,6]],其中位串速构的生成器用的是"<=",表示从位串中提取内容,而列表速构的生成器中"<-"只能从列表中选取元素.
可交叉使用比如:[X||<<X:3>> <= <<41,203,23:5>>] 或者 << <<X:3>>||X<-[1,2,3,4,5,6,7] >>
18.记录(record)中,未赋值也没有默认值的字段,将使用系统默认值(undefined).
19.使用erlang ETS表时,应尽可能避免数据共享,尤其是要避免那种出其不意地在别人背后修改数据的行为.
20.ETS表和数据库的另一个相似点在于,她同样只存储数据行--也就是元组.存储任何Erlang数据之前,都要先将之放入元组中,原因在于:ETS会将元组中的第一个字段作为表的索引,默认采用第一个字段(可以通过建表参数调整).
T = ets:new(mytable,[]),
ets:insert(T,{17,hello}),
ets:insert(T,{42,bye}).
21.ETS查询返回的是一个包含数据行的列表.ets:lookup(T,17) 结果为:[{17,hello}].如果查询不到结果时,返回空列表.
22.Erlang中的尾递归调用,不会将栈空间耗尽,而且效率同while循环一样.一般来说,尾递归方案要比对应的非尾递归方案高效,但不绝对,还取决于具体算法.
23.在保护式(guard)中不要调用length/1函数,length(List)会遍历整个列表.
原文:https://www.cnblogs.com/almost-lover/p/13964270.html