[Erlang]前人挖坑,后人还要进坑?(3)

??

21.在生成随机数过程中一直使用:

random:seed(erlang:now()).

erlang:now()是可以一直递增的数,从不重复,但是不适合用于随机算法,最好使用下面这种:

-spec get_random_num(integer()) -> integer().
get_random_num(Max) ->
    <<A:32, B:32, C:32>> = crypto:rand_bytes(12),
    random:seed({A,B,C}),
    random:uniform(Max).

22.Pid的那3位数字<A,B,C>代表着什么?

  • A, 对应是哪一个节点 (0 代表是本地节点 ,其它数字代表远程节点) ;
  • B, 低15字节代表进程唯一记数(一个进程表的索引)
  • C, 16~18字节也是进程唯一记数(和B一样)

http://stackoverflow.com/questions/243363/can-someone-explain-the-structure-of-a-pid-in-erlang

验证如下:

打开一个终端test1

打开终端test2

23.gen_server进程如果长期不需要处理其它消息,可以使用返回值{noreply,hibernate}进入休眠状态:使用场景:

比如使用者知道在处理完一个特定的消息后这个进程在很长一段时间内不会再有消息处理,可以设定这个消息的返回后进入hibernate状态!

这可以减少内存和cpu消耗。

24.Record这么好用,为什么还是有很多大神吐槽record非常不好?

缺点:

%%1.只能使用原子作为index元素;

%% 2.编译前就确定了结构,不能动态的增加index,比如person要增加一个phone属性,record是做不到的。

所以17后就有了Map这个数据结构,可以突破上面的限制,真正的Map.

http://www.cnblogs.com/zhengsyao/p/erlang_map_brief.html

但是目前的mnesia只支持record的。不支持map,那Record的升级麻烦还会在mneisa中继续存在的。

25. receive 里面after的妙用:

进程阻塞时,用于清空进程信箱消息,

receive
 Msg ->
           do_something(Msg);
after 0 ->
      do_something2)
end.

关键看清楚那个after 0 ,调用这个函数就会把这个进程以前旧的消息都用do_something(Msg)处理掉:(当然你的do_something/1里面会尾递归调用回这个函数啦)

25.ETS 的默认限制个数为1400个,你可以通过:

erl -env ERL_MAX_ETS_TABLES Number

来改变这个默认值,但是这个限制也提示了一个非常重要的信息:不要尝试每一个进程都建立一个ets表!

26. 不要跨节点连接或监控(link,monitor)很多进程:

因为如果节点由于网络故障通信断了,那么所有link或monitor的进程会被马上触发,产生超大量的消息分给超多的进程,这就会给系统增加非常大的负担。

27.使用receive 嵌套实现接收消息的先后关系:

receive
       {first_deal_msg,Msg} ->
                 do_someting(Msg),
                  receive
                        {second_deal_msg,Msg2} ->
                              do_someting2(Msg2)
                  end
end.

28.Erlang为什么叫Erlang?(哈哈,乱入一通):

erlang

n.厄兰(话务单位),占线小时;

名副其实的为通信而先的语言哇…

29.begin end语句块的简洁使用:
问题描述:
将一堆人随机平均分开2组,,怎样去平均?

当然效率不高,但是!看上去很cool…

30. split_binary/2

It is usually more efficient to split a binary using matching instead of calling the split_binary/2 function. Furthermore, mixing bit syntax matching and split_binary/2 may prevent some optimizations of bit syntax matching.

使用比特语法来分离二进制比用split_binary/2更加高效,更进一步来讲,混合使用比特语法和split_binary/2会把编译器弄sb的(不会进行相关的优化任务了)

DO

<<Bin1:Num/binary,Bin2/binary>> = Bin,

DO NOT

{Bin1,Bin2} = split_binary(Bin, Num)
时间: 2024-11-09 03:41:15

[Erlang]前人挖坑,后人还要进坑?(3)的相关文章

[Erlang]前人挖坑,后人还要进坑?(1)

?? 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.

[转]前人挖坑,后人填坑—如何把那些bug挖掘出来

当我们放下一个项目转投下一个时,手头的东西就要转交给他人处理,或者..不再有人处理,可代码还在那里,搞不好你就引用了别人的东西,保不准哪天别人的代码里就爆出了个大 bug,当然这里的“别人”也可能是 你!我们既不希望自己是受害者,更不希望自己是施害者. 写代码不免出点bug,没有人可以保证自己写的代码不出问题,而那些没有被挖掘出来的bug,便成了后来者哭笑不得的坑... 这段时间公司全面 https 改造,涉及到域名的迁移,域名的迁移不是 nginx 做个映射就完事儿了,还有各种代码的去 sch

MonkeyRunner进坑——errors importing other modules

后知后觉,刚知道Android提供了MonkeyRunner这么个东西,能用来干嘛呢,官方文档介绍得很清楚.简单说,可以用Python程序通过API, installs an Android application or test package, runs it, sends keystrokes to it, takes screenshots of its user interface, stores screenshots on the workstation. 还提供了easy pac

最近进坑了DCS-3950双层交换机链路聚合配置整理

交换机A上1-2端口对应交换机B上3-4端口 PC1链接交换机A上23端口 PC2链接交换机B上24端口 命令如下: DCS-3950-28C>enDCS-3950-28C#conDCS-3950-28C(config)#hostname switchAswitchA(config)#%Jan 01 00:01:39 2006 %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet1/2, changed state to DOWN%Ja

致成长——毕业一周年

转眼2015年已过半载,想来自己也已经毕业满一年了,从2013年12月到现在,进公司也有一年过半的时间了,期间从实习生,到试用期,再到转正,这么一路过来,却也过得飞快........ 一直想找个时间,给自己一个总结,也许这种事情本来就应该伴随在生活当中,但是不得不承认,人都是有惰性的,尤其我这种拖延症患者,还好,这个总结来得也不算迟. 2014年七月,拿到毕业证,摘掉了实习生的帽子,终于算是步入社会的“大人”了,有任务出差湖北,一行三人,对于刚毕业的我们来说,这算是新鲜事了,第一次出差,第一次来

Windows10(UWP)下的MEF

前言 最近在帮一家知名外企开发Universal Windows Platform的相关应用,开发过程中不由感慨:项目分为两种,一种叫做前人栽树后人乘凉,一种叫做前人挖坑后人遭殃.不多说了,多说又要变成月经贴了. 讲讲MEF. MEF全称Managed Extensibility Framework.我们做.Net的碰到依赖注入(DI:Dependency Injection)这一块的内容,一般会选择使用Unity或者MEF,这也是Prism主要使用的两种方式.在.Net 4.0之前,MEF一直

升讯威微信营销系统开发实践:(2)功能设计与架构设计

微信开发系列教程,将以一个实际的微信平台项目为案例,深入浅出的讲解微信开发.应用各环节的实现方案和技术细节. 本系列教程的最终目标是完成一个功能完善并达到高可用性能指标的微信管理软件,所以除了与微信本身紧密相关的对接和应用技术,还会讲到其它相关的所有知识点,从技术选型,架构设计,数据层的设计,API的设计,数据传输协议的设计,再到细节的前端的设计及技术应用,后台开发中的各方面技术,都会涉及.同时,在架构设计中,会考虑到运维领域的诸多问题,会涉及到部署环节中负载均衡及CDN分发,服务器流量及带宽控

给割边割点跪了

坑的事情不是知道教程有坑,是知道有坑之后以为大神改了再次跳进去. 我怀疑刘神是故意坑蒟蒻[不,刘神绝对是故意坑蒟蒻]... 两道题都是看着网上的代码a的,伪代码还不如程序代码看着容易...这绝对是惨绝人寰道德沦丧的悲剧啊喂... 大神们说着修路反而撒玻璃碴子之类的事情简直心痛QAQ 看教程不如直接看代码懂得快QAQ贵机房真是个神奇的地方,鹅妹子嘤 前人挖坑后人自杀 割点 上面是教程下面是代码 http://www.cnblogs.com/en-heng/p/4002658.html http:/

流控算法

漏桶算法 令牌桶算法 一年一度的「双 11」又要到了,阿里的码农们进入了一年中最辛苦的时光.各种容量评估.压测.扩容让我们忙得不可开交.洛阳亲友如相问,就说我搞双十一. 如何让系统在汹涌澎湃的流量面前谈笑风生?我们的策略是不要让系统超负荷工作.如果现有的系统扛不住业务目标怎么办?加机器!机器不够怎么办?业务降级,系统限流! 正所谓「他强任他强,清风拂山岗:他横任他横,明月照大江」,降级和限流是大促保障中必不可少的神兵利器,丢卒保车,以暂停边缘业务为代价保障核心业务的资源,以系统不被突发流量压挂为