Erlang 学习笔记

http://wenku.baidu.com/link?url=AUQR8Hn-e-fEB_lqjXsd8XfapWj1qAK7J05JoBXFib_LlSk5qSOTia8HIxNV1XkeZi-kHFsH18Qb9NED5PKiPb8h6oDFVR6KG75MUSYAAMm

Erlang 学习笔记 
   
一、Erlang语言特征重点  
1、catch是返回表达式的值或者错误信息的元组 
try…catch是可以捕捉不同的错误类型以及有流程控制  
2、发送消息永远不会失败,如果尝试发送消息给一个不存在的进程,只会被丢弃信息,但不会产生运行错误  
3、发送一个消息到不存在的“注册进程”会导致badarg错误,从而使调用进程终止。如果不想导致终止调用进程,则需使用try…catch把这个调用保护起来。  
4、刷新邮箱语句 flush()  
5、进程链接是双向的,所以进程A与B相连或进程B与A相连是无关紧要的,其结果都是相同的。如果一个链接进程异常终止,退出信号会发送到与这个终止进程相连的所有进程。退出的信号是具有{‘EXIT’,Pid,Reason}格式的元组,’EXIT’是基元。   
6、捕捉退出信号 process_flag(trap_exit,true)  
7、链接是双向的,为了单向监控进程,可调用 erlang:monitor(process,Proc) ,Proc可以是进程标识符也可以是注册的名称。当带有进程标识符的进程终止时,消息{‘DOWN’,Reference,process,Pid,Reason}会发送到监控进程。重复调用erlang:monitor(process,Pid)会返回不同的引用,从而建立多个独立监控。保险起见,使用erlang:demonitor(Reference,[flush]),它在关闭监控的同时会删除由Reference提供的所有’DOWN’信息。  
8、将宏的参数作为字符串保留,可在变量前加前缀??(如 ??Call)来达到目的    -define(VALUE(Call)),io:format(“~p = ~p~n”,[??Call,Call] )).    Test1() -> ?VALUE(length([1,2,3])). 
    详见 170  
9、预定义的宏  ?MODULE  ?MODULE_STRING  ?FIKE  ?LINE  ?MACHINE    详见170  
10、利用已定义的函数作为其他函数的参数  fun M:F/n      hof1:filter(fun hof1:palin/1,[[2,2],[2,3]]).      
11、列表解析的保护元返回true或false

wk_ad_begin({pid : 21});wk_ad_after(21, function(){$(‘.ad-hidden‘).hide();}, function(){$(‘.ad-hidden‘).show();});

12、使用ets:fun2ms返回一个匹配规约 
     MS = ets:fun2ms(fun({Name,Country,Job}) when Job/= cook -> [Country,Name]  end).      注意fun必须是一个文字函数,即ets:fun2ms/1 调用中输入的函数,而不是绑定一个变量的那个。如果在模块中使用,需要包含一个头文件:       -include_lib(“stdlib/include/ms_transform.hrl”).         
13、在ETS表中默认关键字位置是元组的第一个元素。在记录中,这个位置保留给了记录的类型,除非明确指定关键字的位置,否则无法获得想要的行为。通过表达式#RecordType.KeyField 获取RecordType里KeyField 的位置,可以把 {keypos, #RecordType.KeyField}加入到ets:new/2函数调用的选项列表中。   
14、ets:lookup/2返回符合匹配条件的完整的记录列表,ets:match/2返回的是与变量匹配的值,ets:match_object/2 返回的是全部匹配模式的元组。详见 224-225   
15、当遍历表的时候需要使用 safe_fixtable/2 锁定表,因为在遍历时具有破坏性的操作会引起运行时错误或者更糟,将导致无法预计的行为,把遍历操作封装在catch语句中是个好主意,因为我们需要保证在发生运行时错误时释放表。   
16、如果要发送信息给位于节点[email protected]的一个叫做frequency的进程,需要采用 {frequency,[email protected]} ! Message   
17、如果一个节点可以与其他节点通信,它被称为存货节点。用erlang:is_alive()测试本地运行时系统是否为存活状态,用net_kernel模块函数可以改变系统的存活状态,可以使用node/0内置函数找出当前节点的名字([email protected])   
18、长名字节点只能与其他具有长名字的节点通讯,短名字节点只能与其他具有短名字的节点通讯。  
19、在基本的Erlang RPC实现中,函数调用被一个消息的发送和接收代替 p255   
20、gen_server模块的函数start将生成新的进程,改进程使用已经提供的参数调用CallbackModule模块中的init(Arguments)回调函数。函数init必须初始化服务器的LoopData,并返回一个格式为 {ok,LoopData}的元组。   
21、-behavior(gen_server)指令,只是告诉编译器,你使用的模块是gen_server回调模块,因

此他期望许多回调函数。   
22、习惯上把记录和宏定义放入一个include文件中,使他们能够在整个项目的多个模块中共享。   
23、erlang随机函数的使用方法: 
首先设置seed 
 {A1,A2,A3} = now(), 
          random:seed(A1, A2, A3), 然后再调用 random:uniform() 
  
24、监控进程规范中RestartStrategy(重启策略)包含4个策略选项:     one_for_one, one_for_all, rest_for_one,simple_one_for_one 
    其中如果重启策略是simple_one_for_one,则回调函数init/1中不会去创建子进程。       
二、Erlang启动参数   杂锦 
1、 查看Erlang的最大端口数 : 
在erlang终端输入如下指令,并查看max_fds值 1> erlang:system_info(check_io). 
[{name,erts_poll}, 
 {primary,‘WaitForMultipleObjects‘},  {fallback,false},  {kernel_poll,false},  {memory_size,7001},  {total_poll_set_size,3},  {lazy_updates,false},  {batch_updates,false}, 
 {concurrent_updates,false},      {max_fds,2048}]  
通过修改操作系统的环境变量(ERL_MAX_PORTS),来修改最大端口数. 比如linux在在shell中添加: export ERL_MAX_PORTS=1024000

2、通过引用来保证请求和响应包是同一个会话 
    make_ref() ,它在一个节点的生命周期内几乎是唯一的,2的28次方调用后才会重复     具体详见《Erlang编程指南》211页     
三、网上收集  
1、连接上了数据库之后怎么查询会这个错: mysql:fetch(p1,<<"SELECT * FROM SERVICE">>).  ** exception error: no function clause matching  
                    mysql:fetch(p1,<<"SELECT * FROM SERVICE">>)   
需要注意,官方放在googlecode的测试代码已经旧了,fetch接口实际上需要一个二进制list,所以是[<<"select * from table">>]格式,而不是<<”select * from table”>>格式。    
2、有一个gen_server进程,我能注册local和global两个名字么?因为我的应用跨节点,我想让本地访问使用local,其它节点使用global, 不知道可行不?  
在gen_server的启动函数start和start_link中可以为进程指定名称为local或global。 但是依照你的需求描述,其实在init/1中,你可以通过erlang:register/2或者global:register_name/2来为进程注册另外一个名字。因为local那么是erlang虚拟机内部维护的一个数据,而global则使用ets维护数据,所以一个进程可以同时拥有local和global name。 
 
更多请参考. stdlib/src/global.erl 和 stdlib/src/gen.erl 的代码。   
3、接入Erlang控制台的几种方法  
 在window中调试的时候我们可以通过启动多个cmd窗口运行Erlang节点,在生产环境中我们需要Erlang服务在Centos服务器上后台运行;这就需要在启动的时候添加启动参数detached来脱离终端:      -detached Starts the Erlang runtime system detached from the system console. Useful for running daemons and backgrounds processes. Implies -noinput. 
      对于我们自己的服务,即使部署到了生产环境一定要做到"像魔术师的飞刀,出手但并没有脱手",还是需要一些方式进入到Erlang后台进程来做一些工作比如:查看某一个Erlang节点的运行时信息(内存,进程数等),让服务优雅的退出而不是kill进程,或者做一下热更新(参见:[Erlang 0010] Erlang 热更新 当然热更新可以使用reloader.erl的方案来简化);一开始的时候服务器比较少,我们采用的是JCL的方式去处理的;

Erlang Shell JCL 
JCL是Erlang Shell的一种运行模式,即Job Control Mode (JCL, in which jobs can be started, killed, detached and connected).我们启动两个节点来完成这个操作; 
Node_1 添加了-detached选项,启动之后直接在后台运行并没有启动Shell erl -setcookie abc -name [email protected] -detached  Node_2 使用了和Node_1相同的cookie,启动之后进入Erlang Shell界面 erl -setcookie abc -name [email protected] 下面我们开始在[email protected]演练JCL: Eshell V5.9  (abort with ^G) 
([email protected])1> node().    %当前这是在node_2 ‘[email protected]‘ 
([email protected])2>                %Control + G 进入JCL模式 User switch command --> h   
  c [nn]            - connect to job   i [nn]            - interrupt job   k [nn]            - kill job   j                 - list all jobs   s [shell]         - start local shell   r [node [shell]]  - start remote shell   q        - quit erlang 
  ? | h             - this message 
--> r‘[email protected]‘                           %尝试连接到[email protected]   --> j 
   1  {shell,start,[init]}                                          %列出所有的Job    2* {‘[email protected]‘,shell,start,[]} 
--> c 2                                                               %这里2是job的编号,切换到job 2  
Eshell V5.9  (abort with ^G) 
([email protected])1> node().                %注意提示符,现在已经是在node_1 ‘[email protected]‘ 
([email protected])2> erlang:now(). {1326,801888,347570} 
([email protected])3>                             %再一次Control + G User switch command                                    
--> j                                                                       1  {shell,start,[init]} 
   2* {‘[email protected]‘,shell,start,[]} 
--> c 1                                                               %切换到job 1 ([email protected])2> node().                %注意提示符,我们已经回到了node_2 ‘[email protected]‘ ([email protected])3>  复制代码

时间: 2024-11-09 02:39:43

Erlang 学习笔记的相关文章

Erlang学习笔记(一)

概述 ================================= 前端时间学习cpp,感到有些疲惫,也感到了一些困惑,久思未解. 正好放松下自己,就拿起了erlang. erlang是一个高并发的编程语言,而且支持热部署,适合做DB server. 虽然erlang的计算能力相对于他的并发能力要逊色很多,但是erlang同时也提供了port.可以让C,C++等计算效率高的语言来完成这部分功能 过程 ================================= 看了orally的 <

Erlang学习笔记2

http://wgcode.iteye.com/blog/1007623 第二章 入门 1.所有的变量都必须以大写字母开头,如果要查看某个变量,只要输入变量的名字即可,如果一个变量被赋予值,就称为绑定变量,否则被称为自由变量,一开始所有变量都是自由的. 有一点像Java中的常量,这就是为什么用大写字母的原因. 2.  “=” 近似于一个赋值操作符,是一个模式匹配运算符,当X是自由变量未被赋值时“=”是赋值运算符,否则是模式匹配运算符. 3. “/”除号永远返回浮点数. 4. 原子用来表示不同的非

erlang学习笔记(shell命令)

erlang shell 命令: help(). 可以查看erlang shell内置命令. 比如:m(Mod),可以查看模块Mod. 待续..

erlang学习笔记

Erlang是一门函数式编程语言,具有不可变状态 Erlang的变量是一次性赋值变量(single-assignment variable) 在Erlang里,变量的获得值是一次成功模式匹配操作的结果,=是一个模式匹配操作符 在Erlang里,原子被用于表示常量值,原子是全局性的,以小写字母开头,还可以放在单引号内,一个原子的值就是它本身 元组用于把一些数量固定的项目归组成单一的实体,用大括号括起,元组会在声明时自动创建,不再使用时则被销毁 对于不感兴趣的变量,可以用_ 作为占位符,符号_被称为

erlang学习笔记(文件操作)

参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)

Redis学习笔记~目录

redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都 支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排 序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更

thrift学习笔记

Thrift学习笔记 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java,Python,Ruby,JavaScript,Node.js,Go,C,C++,C#,Erlang,Delphi,Perl,Php,SmallTalk,OCaml,Haxe,Haskell,D语言.Thrift采用IDL(Interface Defination Language)描述性语言来定义

[Golong]学习笔记(一) 基础知识

Go编程基础 Go的内置关键字(25个) 不多 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continute for import return var Go的注释方法(和js一样) 单行注释: // 多行注释: /**/ Go程序一般结构 common_structure.go 通过 pack

SO_REUSEPORT学习笔记

SO_REUSEPORT学习笔记 时间 2015-02-12 16:50:00 BlogJava-技术区 原文  http://www.blogjava.net/yongboy/archive/2015/02/12/422893.html 主题 Socket 前言 本篇用于记录学习SO_REUSEPORT的笔记和心得,末尾还会提供一个bindp小工具也能为已有的程序享受这个新的特性. 当前Linux网络应用程序问题 运行在Linux系统上网络应用程序,为了利用多核的优势,一般使用以下比较典型的多