ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
* Erlang的设计哲学是为每一个独立的事件创建一个新进程. * Erlang的容错处理:如果不能完成一个任务就死掉 让其它正常的进程来善后。link函数就是用来建立这种进程间的双向连接来监测非正常退出,并做出处理。 * side-effect-free无副作用,其中一种定义是说:一个程序执行前后保持程序的状态不变,不改变非局部变量的值,不改变传入参数值,也无I/O * Erlang GC的特点是:每个进程独立进行GC ,分代(generational garbage) ,复制回收 * Erlang的模式匹配作用:1.变量赋值 2.提取变量值 3.控制流 * ETS也是不参与GC的 * Erlang是动态强类型的语言 dynamic-strong Typing * windows环境Erlang GUI工具:toolbar:start(). tv:start() pman:start(). appmon:start() debugger:start() * 还有一个WebUI的工具 webtool:start(). * Erlang属于面向消息的语言,面向消息的语言没有共享对象,进程间交互通过收发消息完成 * Erlang中一个已经赋值的变量就是一个指针,指向存储值的存储区! * 单次赋值实际上就是存储区的值不会被修改 * Erlang不共享内存,也就没有了锁的问题 * 函数子句的顺序匹配的顺序是其在文件中的顺序 * 列表解析的数据生成器部分通过模式匹配也可以是达到数据过滤的目的[X||{a,X}<-[{a,1},{b,12},{c,33},{a,23}]]. * 所有的BIF都在erlang模块中,所以不要奇怪这个模块包含的函数那么杂! * bit语法 End-Sign-Type-Unit 一个数据样例: 8/unsigned-little-integer * 二进制数据中使用的整数都必须要在0到255之间,这是因为二进制数据包含的每个字节都是8位, ```erlang 2#11111111<<A>> = <<255>>. <<B>> = <<256>>. <<C>> = <<257>>. A B C 的值分别是255 0 1 ``` * 由字符序列组成的二进制数据等同于由其每一个字符ASCII编码组成的二进制数据<<"king">> == <<$k,$i,$n,$g>> * beam_lib:chunk/2方法可以在不加载代码的情况下分析beam的元数据 * F1=fun(X) when X==0 -> X; (X) -> X+100 end. %注意这里的可以使用guard * step_two(N, Total) when N =/= 0 -> step_two(N-1, Total+N). %注意也是用了guard * epp erlang预处理器我之前在说宏和record的时候提到过 链接:http://www.cnblogs.com/me-sa/archive/2011/07/20/erlang0006.html * 进程字典用来放全局只读配置还是很合适的 * erlang:make_ref 创建唯一标识,在gen_tcp常用到 * . q() 是init:stop()的别名 erlang:halt() 这两个方法都可以关闭erlang系统 * erl 参数 -s可以有多个依次执行 -noshell参数可以让程序在后台运行 * code:clash()方法在code path中查找重名的模块 * 在shell中按下Ctrl +G 进入"shell JCL" job control language 常用的就是 j c r 三个命令 * 在shell里面执行help() 很多实用的辅助方法 * spawn(fun)这个方法执行不会失败,总会返回一个pid * erlang:system_info/1可以取到运行时的系统信息,比如进程数 原子数 内存消耗等等 * receive的0超时语句可以帮我们快速清空邮件队列刀 * 捕捉退出消息的进程被称为系统进程(system process),学习新东西很多时候在于术语带来的门槛 * 在线上处理问题的时候用过exit(Pid,kill)来清理僵尸进程 * 只有在不需要使用DNS服务的场景才可以使用-sname * 要让Erlang节点在不同主机间互通需要打开TCP和UDP的4369端口,empd(Erlang Port Mapper Daemon)会使用这个端口 * 使用分布式Erlang需要打开一些端口或指定端口范围,并确保防火墙已经放开 启动参数使用-kernel inet_dist_listen_min * file:consult可以直接把文件中的Erlang项读取出来 file:unconsult可以把Erlang项写入文件一 * io:format("123~w~n",["abc"]). 输出:123[97,98,99] ~w以标准语法写入数据 * io:format("123~p~n",["abc"]). 输出:123“abc” ~p 完整打印参数 * group_leader()的作用就是管理输出,比如rpc调用会把目标机执行的结果输出截获输出到当前shell * A Compacting Garbage Collector for ERLANG (1997) http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2421 * Erlang的容错处理:如果不能完成一个任务就死掉 让其它正常的进程来善后。link函数就是用来建立这种进程间的双向连接来监测非正常退出,并做出处理。 * BIFs是built-in functions的缩写代表这些方法是Erlang运行时系统的一部分 * 写function的时候在最后添加一个catch_all的方法也被认为是最佳实践 * 如果可预见结果集的所有可能性,那么case语句不建议使用catch_all * process dictionary几乎被描述成洪水猛兽了,对于一次写入然后就只读的配置性数据放在进程字典应该没有问题 * Erlang出错法则:让错误报告在它发生的地方 * 查看module的元数据信息 比如a.erl a:module_info(). m(a). * Erlang的元编程Meta Programming确实直接,apply/3 甚至在参数确定情况下的直接调用M:F(A) * Concurrency is the ability for different functions to execute in parallel without affecting each other unless explicitly programmed to do so. * 我们要遍历ETS可以使用first/next 也可以使用foldr foldl,但是后者会把ETS数据复制到进程,数据量大时有效率问题 * 可以使用record_info()来查看record定义 *