[Erl_Question11] 那些经历过的Erlang小坑11-20

11.每次重装系统时都会重新安装Erlang,Ubuntu安装sh秒杀一切.

https://gist.github.com/zhongwencool/11174620

12. Erlang Shell隐藏的小技巧:

    f(). %%把所有绑定变量释放掉
    f(Val). %%把Val变量释放掉
    v(Line). %%把Line行函数重新执行一次
    v(-1). %%把前一行的函数重新执行一次
    rr(Module).%%把Module中的Record加载到Shell中,【超有用】
    rr("*/*"). %%把在这个子目录下的所有Module里面的Record给加载到Shell里面
    rp(Expression).%%把Expression的全部元素给打印到shell里面【超有用】

rl(). %%列出所有已定义过的Record.rf(RecordName).%%不加载名为RecordName的Record

     %%如果你的code加了debug_info信息【compile:file(Module,[debug_info])】你可以这样看源代码
    {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]),
    io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).

13. Erlang中有很多不可逆函数:比如 binary_to_list/1 , list_to_binary/1

  > binary_to_list(list_to_binary([ <<1,2>>,<<3,4>>])).
    [1,2,3,4]

这个坑有点深,踩过才知道!这还有个和binary一起的小Tip:

   > <<"xyz","ets","bt">> =:= <<"xyzetsbt">>.
     true

binary居然是等价的。

14.在保护式里面 ,等价于andalso ;等价于orelse------[但是:不是完全相同,原因如下]

   %%相同点:   right_age(X) when X >= 16, X =< 104 -> %% X>=16 andalso X =< 104
    true;
   right_age(_) –>
    false.

不同点:

    %%当Condition1异常出错时,还会去判断Condtion2,如果使用orelse则会直接返回false
    func() when Condition1 ; Condition2 –>
      ok;
    func() –>
      error.

可以和http://www.cnblogs.com/zhongwencool/p/3712909.html 第一条对比一下,理解更深哦。

15.如果你想在实践中使用二叉树,请看gb_tree.erl,不要再造不必要的轮子啦,【不过可以考虑用来做练习】

16. 在try catch 的异常处理中禁止使用尾递归:

因为在这个异常处理部分有一个保护机制,Erlang绝对相信异常处理是正常的,如果你在这里面使用尾递归,会出现以下情况:

    1) 尾递归变死循环啦【项目实践中可能会发生的】;
    2) 非常多的进程进入了这个异常中,这个尾递归处理的东西又非常复杂,VM运行长久后,block大量的进程和消耗内存

这样的结果是:内存耗尽或程序特别慢,关键你还是查找不到最后的crash的原因。

所以推荐:异常处理中只使用必要且简单的处理就行了。

17. 如果你想在Erlang中 kill一个进程:找到Pid后,exit(Pid,Reasno).【效果和kill一样啦】

大部分情况不会起作用!!!!!因为在项目里面你的进程如果合规范都是在监控树下的,如果被exit/2后还会被监控树自动重启啦,所以你要先把进程移除监控树!!!

    supervisor:terminate_child(SupPid,Pid),
    supervisor: delete_child(SupPid,Pid).

18. 2个进程可以双向连接和单向连接:

双向: link(Pid1,Pid2). 重复调用效果一样,也就是说对同2个进程无论调用多少次link,只要使用一次unlink(Pid1,Pid2)就解除连接

单向:erlang:monitor/2   erlang: demonitor/1

19. receive  after Time

这个Time最大值是50*24*60*60*1000,当时间大于50天时,就会报错:

所以要把Time拆成小于最大值的列表:

  normalize(Time) –>
      Limit = 49*24*60*60,
      [Time rem Limit | lists:duplicate(Time div Limit, Limit)].

然后如果时间列表不为空就不断减少列表并等待直到列表为空:

  loop([T|Next]}) –>
     receive
        {Server, Ref, cancel} –>
           Server ! {Ref, ok}
        after T*1000 –>
           if Next =:= [] –>
               Server ! {done, S#state.name};
              Next =/= [] –>
              loop(Next})
           end
     end.

20. gen_server里面的handle_call/3 和handle_cast/2返回值都可以加个Timeout时间。

如果这个时间内没有处理完就会发出一个timeout信息:由handle_info处理,具体可见:http://www.cnblogs.com/zhongwencool/p/erlang_timer.html 里面的方法二。

[Erl_Question11] 那些经历过的Erlang小坑11-20

时间: 2024-08-23 00:38:58

[Erl_Question11] 那些经历过的Erlang小坑11-20的相关文章

[Erl_Question02] 那些经历过的Erlang小坑(持续更新)

1. 保护式(guard)中如果出错,不会报错,只会返回false! case 1=:1 of true when not erlang:length(t) =:= 1 orelse true -> ok; _ -> error end. Result is:   error 保护式中对t (atom) 求length会出错,本应crash掉,但因为在保护式中,默认出错后结束此保护式计算并返回false,这也是为什么保护式不接受复杂的函数,只能用erlang的bif来做的原因之一. 2. tr

支付宝集成的小坑--集成支付宝集成总结(1)

现在很多公司的APP都会有支付环节,特别是现在的O2O项目,我参与过的近两个项目都有集成支付宝对两次集成做一下总结: 第一次集成支付宝,由于我们的做后台的大牛写了十几年代码,而且以前是银行项目的总监,整个支付流程基本上一切听大牛的,我按照做就行.基本上按照支付宝的流程走,支付环节没怎么出问题,总体来说支付流程比较perfect. 第一次集成的小坑: 1)无非就是支付宝里面使用了一些框架如SBJson 等常用的开源框架,而我们项目中也会用到SBJson类似的框架,估计会出现冲突 冲突的解决办法:A

一个关于Windows下SetCursorPos和GetCursorPos的小坑

这两天在做一个编辑特定格式Mesh的小工具,需要检查鼠标的移动,一般来说可以用WM_MOUSEMOVE事件解决的,但是我为了省事用了定时查询+设置的方式,也就是: 1 void Frame(void) 2 { 3 //do something else... 4 5 POINT cursorPos; 6 GetCursorPos(&cursorPos); 7 curMoveX = cursorPos.x - cursorBaseX; 8 curMoveY = cursorPos.y - curs

C#中的Infinity有个小坑

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的一个小坑. 我们知道,在C#中主要有如下几种数值类型:int.long.decimal.float和double.对于前三种,如果除零,那么会提示表达式错误(直接书写数字)或报DivideByZeroException异常(使用变量):对于后面两种,除零会得到正负无穷大,除非你是0.0/0.0那么会得到NaN

erlang 小程序:整数序列,搜索和为正的最长子序列

最近学习了一下erlang, 编了个小程序 算法如下: 把参数分为三个 当前位置的前子序列(Save)(比如 -5, 1,2,-1, _, ... ) 前位置为_时, 前子序列就是 1,2,-1 以及此子序列的和(CurSum) ( 1,2,-1的 CurSum 是 2) 剩余的数 Rest:  剩余的数也可以表示为 [H|T] ,H是第一元素,T为剩余的元素是列表 处理过程如下: 如果 Rest 为空,说明处理完毕,打印 CurSum和Save 如果,还剩一个元素(Rest只有一个元素) 如果

bottle的几个小坑

距离我在<web.py应用工具库:webpyext>里说要换用bottle,已经过去快两个月了--事实上在那之前我已经開始着手在换了.眼下那个用于 Backbone.js 介绍的样例程序已经完毕更换,其他一些原来基于web.py的应用也在逐步重写中.期间各种小坑不断,还好至今还没有碰到什么大坑--只是目測应该也不会有大坑. unicode 作为非英文应用的开发人员,unicode是一个绕只是去的坑. web.py 对此是不作处理的,全都按原编码方式处理. bottle 则作了一个有点奇怪的处理

CI load-&gt;view();的一个小坑。。。

CI load->view()  很智能,如果加载多个视图  他会全部读完再按顺序载入所有视图 但这里有一个小坑,底层会遍历你的函数,看有多少视图 再决定当前的视图是否为最后一个, 如果你的代码中有die exit这个的语句, 这个遍历就会被近中止, 所有的视图就都不会执行 切记 切记.. 如果想要中断这种机制,  直接执行视图,不执行下面的语句, : 加上$this->output->_display();就好了 但是这样就会失去灵活性. 谨慎用.

light oj 1066Gathering Food (bfs 稍微有点小坑)

1066 - Gathering Food Winter is approaching! The weather is getting colder and days are becoming shorter. The animals take different measures to adjust themselves during this season. - Some of them "migrate." This means they travel to other plac

MySQL MHA在线手动切换——小坑

今天测试了MySQL的高可用架构--MHA,并进行了自动切换.手动failover以及手动在线切换,其中手动在线切换发现小坑:当旧master切换为新slave后,没有自动将read_only设置为on,例证如下: 环境说明: OS:CentOS release 6.5 MySQL: 5.6.22-71.0-log Percona Server slave1:172.16.52.130 mysql> show variables like 'read_only'; +--------------