热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

erlang你不知道的事

学习Erlang的时候在书的留白处随手记录了一些东西,还有一些记录在了demo的注释里面,今天抽时间整理出来了一部分,分享一下.Erlang的设计哲学是为每一个独立的事件创建一个新进程.Erlang
学习Erlang的时候在书的留白处随手记录了一些东西,还有一些记录在了demo的注释里面,今天抽时间整理出来了一部分,分享一下.

 

  1. Erlang的设计哲学是为每一个独立的事件创建一个新进程.
  2. Erlang的容错处理:如果不能完成一个任务就死掉 让其它正常的进程来善后。link函数就是用来建立这种进程间的双向连接来监测非正常退出,并做出处理。
  3. BIFs是built-in functions的缩写代表这些方法是Erlang运行时系统的一部分
  4. side-effect-free无副作用,其中一种定义是说:一个程序执行前后保持程序的状态不变,不改变非局部变量的值,不改变传入参数值,也无I/O
  5. 写测试模块的时候不必频繁导出函数  –compile(export_all) 就可以导出所有函数
  6. Erlang中整数值没有上限值,最大值只是受限于硬件(内存有多大)
  7. 在Erlang Shell中可以方便的做进制转换:Base#Value Base的范围2~16 2#101011
  8. Erlang Shell中查询ASCII码 $1 $a $A $\n $\}
  9. Erlang Shell中释放变量使用f() 定义record使用rd(),读取shell输入使用io:read/1可以接受输入Erlang term.
  10. Erlang Shell中接受消息使用flush() 自己的Pid是self() 查看进程信息使用processes() i() 但是不要在进程非常多的场景使用,会消耗大量内存
  11. atom是否已经注册的:registered() unregister(Pid) whereis(Atom) regs().
  12. atom能够进行的唯一运算就是比较
  13. atom是可以使用.和@的,但是别给自己添乱
  14. atom会被记录在ERT系统表中,只需要几个字节,atom之间比较起来也很快
  15. atom不参与Erlang GC,所以atom不能无节制的创建,list_to_existing_atom可以一定程度上缓解创建重复atom的内存消耗
  16. Tuple是Erlang表达复杂数据结构的手段,第一个元素经常被称作Tag,Tag Massage是Erlang编程的最佳实践
  17. Tuple索引是从1开始的,执行一下 element(1,{a,b,c}).看看 再试一下element(0,{a,b,c})看看报什么错
  18. Tuple大小使用tuple_size({1,2,3,4,5}).
  19. M++N会遍历列表M所以如果必须要使用++也要让数据量小的List在前面
  20. proplist对于处理key_value的list真的是非常方面
  21. List=[Element|List]所以你可以在shell中可以输入[1,2|3],尝试匹配一下它 [A,B,C]=[1,2|3]再试一下[P,Q]=[1,2,3]
  22. List最后一个元素是空列表[],被称作well-formed list正则列表,[1,2|3]这种结构要避免
  23. --操作符是针对元素进行的 [1,2]--[3]结果是[1,2] [2,2]--[2]结果是[2],运算顺序是从右到左, [1,2,3]--[1,2]--[1].结果是[1,3]
  24. number
  25. =:= =/=精确比较运算不仅比较值,还比较类型,效率更高
  26. Erlang GC的特点是:每个进程独立进行GC ,分代(generational garbage) ,复制回收
  27. Erlang的模式匹配作用:1.变量赋值 2.提取变量值 3.控制流
  28. 写function的时候在最后添加一个catch_all的方法也被认为是最佳实践
  29. 如果可预见结果集的所有可能性,那么case语句不建议使用catch_all
  30. if语句会对Guard子句做catch,所以 if 1/0 ->a; true ->b end.的返回值是b而不是抛出异常
  31. if的Guard子句放在变量里就可以让异常抛出来:G=1/0 , if G->a; true ->b end.
  32. Guard subexpressions resulting in a runtime error are treated as returning false
  33. Guard可以使用, ; 表达多个条件if  X=:=1,Y<2;X+Y<4 ->ok; true ->error end.
  34. process dictionary几乎被描述成洪水猛兽了,对于一次写入然后就只读的配置性数据放在进程字典应该没有问题
  35. Erlang出错法则:让错误报告在它发生的地方
  36. 查看module的元数据信息  比如a.erl a:module_info().   m(a).
  37. Erlang的元编程Meta Programming确实直接,apply/3 甚至在参数确定情况下的直接调用M:F(A)
  38. Concurrency is the ability for different functions to execute in parallel without affecting each other unless explicitly programmed to do so.
  39. 我们要遍历ETS可以使用first/next 也可以使用foldr foldl,但是后者会把ETS数据复制到进程,数据量大时有效率问题
  40. 负责进程创建职责的是Erlang VM中的Scheduler
  41. spawn第三个参数是List,这个调用的时候注意!!
  42. Spawning a process will never fail!!!
  43. Sending a message will never fail!!!
  44. receive子句的处理逻辑抽取为一个独立的方法是推荐的做法
  45. receive如果接受到没有匹配任何子句的消息,那么这条消息就会保存在mailbox,长此以往就会耗尽内存系统崩溃之险;
  46. 消息发送的速度快于进程处理的速度就会增加CPU上的消耗,因为会反复扫描mailbox
  47. Not handling unknown messages should therefore be treated as a bug. 匹配未知消息会导致难以发现错误,所以这些位置要记录日志
  48. 选择性接受和mailbox这两个东西就解决了消息接受缓冲区的问题
  49. A race condition occurs when the behavior of a system depends on the order in which certain events occur: these events “race” to influence the behavior.
  50. 上面两个不失败的设计原则是为了解除进程依赖:另外一个进程的创建和接受消息是否成功不影响当前进程的正常执行
  51. timer:tc/3计算方法的执行时间 这个构建简单的性能测试很方便
  52.  {'EXIT', Pid, Reason}退出消息的格式包含的信息:谁因为什么退出了
  53.  process_flag(trap_exit, true).退出截获的决策当然是在生命周期的早期进行配置。所以一般出现在init阶段。
  54. 截获到底做了一件什么事情呢?把退出消息放在进程收件箱中当成一个普通的消息来处理。这就相当于我们把异常信息放在返回结果中的情况
  55. receive接收并处理退出信号,退出消息被截获就不再传播
  56. link是双向的,monitor是单向的,被监控的进程死掉后,监控进程会收到  {'DOWN',Reference,process,Pid,Reason} 消息
  57. 如果接收到{'EXIT', Pid, Reason}的进程没有trap_exit,而且Reason不是normal,这个进程就会终止掉并继续传播这个退出消息
  58. 所有的BIFs的执行都是原子性的,所以spawn_link不等同于spawn 和 link的组合调用
  59. {'EXIT', Pid, Reason}Reason如果是kill,关联进程无论是否trap_exit都会死掉
  60. {'EXIT', Pid, Reason}Reason如果是normal,关联进程trap_exit会收到一条{'EXIT', Pid, normal}消息,如果没有trap_exit什么都不会发生
  61.  可以使用record_info()来查看record定义
  62. ETS也是不参与GC的
  63. Erlang是动态强类型的语言 dynamic-strong Typing
  64. windows环境Erlang GUI工具:toolbar:start(). tv:start() pman:start(). appmon:start() debugger:start()
  65. 还有一个WebUI的工具 webtool:start().
  66. Note: Using the form [1 | 2] gives what we call an 'improper list'. Improper lists will work when you pattern match in the [Head|Tail] manner, but will fail to be used with standard functions of Erlang (even length()). This is because Erlang expects proper lists. Proper lists end with an empty list as their last cell. When declaring an item like[2], the list is automatically formed in a proper manner. As such, [1|[2]] would work! Improper lists, although syntactically valid, are of very limited use outside of user-defined data structures.
  67. 在EShell中执行Erlang方法
    $> erl -boot start_clean -noshell -eval 'io:format("hi\n")' -eval 'halt(0)'
    % or
    $> erl -boot start_clean -noshell -eval 'io:format("hi\n"), halt(0)'

    % example:
    erl -sname ad_service -eval 'ok=mnesia:create_schema([node()]).' -s init stop

  68. 打印浮点型
    lists:flatten(io_lib:format("~.*..f", [2, S]));

    3> lists:flatten(io_lib:format("~.*..f", [2, 192.2225])).
    "192.22"
    4> lists:flatten(io_lib:format("~.*..f", [3, 192.2225])).
    "192.223"

    5> lists:flatten([io_lib:format("~8.2.0B,", [L]) || L <- [1,2,3]]).
    "00000001,00000010,00000011,"
    6> lists:flatten([io_lib:format("~2.16.0B ", [L]) || L <- [1,2,3]]).
    "01 02 03 ".

  69. 找出消耗内存最多的进程
    lists:reverse(lists:keysort(2,[{P, erlang:process_info(P, heap_size)} || P <- erlang:processes()])).

  70. 找到最消耗内存的ETS表
    lists:reverse(lists:keysort(2,[{T, ets:info(T, memory)} || T <- ets:all()])).

  71. record类型作为参数的小技巧
    -record(x,{name,zz}).
    -record(y,{yy,name}).
    -export([test1/0,test2/0]).
    -define(create(Type,Name),#Type{name = Name}).

    test1() -> ?create(x,"Noel"). % -> {x,"Noel",undefined}
    test2() -> ?create(y,"Noel"). % -> {y,undefined,"Noel"}

  72. binary_to_list VS bitstring_to_list

    1> A = <<1:2, 23:6>>.
    <<"W">>
    2> B = <<1:2, 23:5>>.
    <<55:7>>
    3> binary_to_list(A).
    "W"
    4> binary_to_list(B).
    ** exception error: bad argument
    in function binary_to_list/1
    called as binary_to_list(<<55:7>>)
    5> bitstring_to_list(A).
    "W"
    6> bitstring_to_list(B).
    [<<55:7>>]

  73. Erlang执行操作系统命令 os:cmd("uptime").

  74. [3] or "3"
    17> [51] =:= "3".
    true
    18> [3] =:= "3".
    false
    19>

  75.  

    如果仅仅是将一系列的模块打包在一起,并不需要启动application,那么只需要在app文件中移除掉{mod,{Module,Args}}配置节即可.这种Libiary Application典型范例就是stdlib.
    看配置文件:

    View Code

     


     

  76.  erlang:now常用作随机数的种子,这个并不是太好,建议使用:

    4> <<A:32,B:32,C:32>> = crypto:strong_rand_bytes(12) .
    <<
    42,136,117,238,28,89,154,241,88,189,70,139>>
    5> b().
    A =
    713586158
    B =
    475634417
    C =
    1488799371
    ok

推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • vue使用
    关键词: ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
author-avatar
Keai丶绿茶_890
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有