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、如果要发送信息给位于节点foo@STC的一个叫做frequency的进程,需要采用 {frequency,foo@STC} ! Message   
17、如果一个节点可以与其他节点通信,它被称为存货节点。用erlang:is_alive()测试本地运行时系统是否为存活状态,用net_kernel模块函数可以改变系统的存活状态,可以使用node/0内置函数找出当前节点的名字(foo@STC.local)   
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 node_1@192.168.1.123 -detached  Node_2 使用了和Node_1相同的cookie,启动之后进入Erlang Shell界面 erl -setcookie abc -name node_2@192.168.1.123 下面我们开始在node_2@192.168.1.123演练JCL: Eshell V5.9  (abort with ^G) 
(node_2@192.168.1.123)1> node().    %当前这是在node_2 'node_2@192.168.1.123' 
(node_2@192.168.1.123)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'node_1@192.168.1.123'                           %尝试连接到node_1@192.168.1.123   --> j 
   1  {shell,start,[init]}                                          %列出所有的Job    2* {'node_1@192.168.1.123',shell,start,[]} 
--> c 2                                                               %这里2是job的编号,切换到job 2  
Eshell V5.9  (abort with ^G) 
(node_1@192.168.1.123)1> node().                %注意提示符,现在已经是在node_1 'node_1@192.168.1.123' 
(node_1@192.168.1.123)2> erlang:now(). {1326,801888,347570} 
(node_1@192.168.1.123)3>                             %再一次Control + G User switch command                                    
--> j                                                                       1  {shell,start,[init]} 
   2* {'node_1@192.168.1.123',shell,start,[]} 
--> c 1                                                               %切换到job 1 (node_2@192.168.1.123)2> node().                %注意提示符,我们已经回到了node_2 'node_2@192.168.1.123' (node_2@192.168.1.123)3>  复制代码

Erlang 学习笔记的更多相关文章

  1. erlang学习笔记(shell命令)

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

  2. Programming Erlang 学习笔记(一)

    入门 启动Shell 在cmd中输入命令”erl”,百分号(%)表示一个注释的开始,从百分号开始到这行结束的所有文本都被看做是注释. 一个完整的命令需要以一个句点和一个回车结束. 退出erlang的命 ...

  3. erlang学习笔记之基础语法

    字符串是双引号,单引号的是atom元组: 下标从1开始 X = {'test1',2,3,4}. element(1,X). 配合模式匹配,可以给元素项命名,直接不用下标标记元素项 列表增删改查 增加 ...

  4. Erlang学习笔记2

    http://wgcode.iteye.com/blog/1007623 第二章 入门 1.所有的变量都必须以大写字母开头,如果要查看某个变量,只要输入变量的名字即可,如果一个变量被赋予值,就称为绑定 ...

  5. erlang学习笔记

    安装 Ubuntu Server上: sudo apt-get install erlang 如果安装时下载 太慢,可手工下载deb包( esl-erlang_16.a-rc1_ubuntu_prec ...

  6. erlang学习笔记(文件操作)

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

  7. erlang学习笔记(2)

    函数%###geometry.erl###-module(geometry). 定义-export([area/1, function1/2, function2/0, ...]).area({rec ...

  8. erlang学习笔记(1)

    提示符erl 注释% comment 表达式123456789 * 123456789. 变量(单一赋值)X = 123456789.X.Y = X * X * X.Y.f(). 整数浮点数X = 5 ...

  9. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

随机推荐

  1. 关于laravel框架分页报错的问题

    因为laravel框架有自己的分页封装,所以与其他框架相比laravel框架的分页的实现要方便的多 只要分别在php脚本与视图中使用 $data=DB::table('index_pic')-> ...

  2. 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况

    网络产品推广和新闻消息推送时,经常用到的工具就是用客户邮箱发送邮件了,如果是要发送的邮件量非常大的话,一般的建议是搭建自己的邮局服务器,或者是花钱购买专业的邮件群发服务,免费邮箱的SMTP适合少量的邮 ...

  3. ANSI转UTF-8中文无乱码解决方案

    近期做的项目需要使用Doxygen生成文档,由于前期代码不是本人完成,他使用的是ANSI格式的文件,后来我用Notepad++写其他文件时,默认保存为UTF-8 无BOM编码格式,因此整个项目文件中既 ...

  4. Dcloud开发webApp踩过的坑

    Dcloud开发webApp踩过的坑 一.总结 一句话总结:HTML5+扩展了JavaScript对象plus,使得js可以调用各种浏览器无法实现或实现不佳的系统能力,设备能力如摄像头.陀螺仪.文件系 ...

  5. (转)c运行库、c标准库、windows API的区别和联系

    C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...

  6. echarts3.0 仪表盘实例更改完成占用率实例

    需要完成的项目效果 官方实例效果 基本思路: 首先引入jquery和echarts3.0库. 需要两个仪表盘,一个仪表盘是纯色灰色,在底部.startAngle 和endAngle永远是最大值,默认为 ...

  7. AspJpeg2.0组件教程完整版 aspjpeg教程...

    AspJpeg是一款功能强大的基于Microsoft IIS环境的图片处理组件,网络上对其进行详细和深入介绍的中文文章并不多,即使有一般也只是牵涉到图片缩略图和图片水印,这与其为英文版本有着密切的关系 ...

  8. spring接收对象数组实例

    JS var param= new Array(); var one= new Object; one.id = '1'; one.name= 'simba1'; param.push(one); v ...

  9. Android内存优化(使用SparseArray和ArrayMap取代HashMap)

    在Android开发时,我们使用的大部分都是Java的api,比方HashMap这个api,使用率非常高,可是对于Android这样的对内存非常敏感的移动平台,非常多时候使用一些java的api并不能 ...

  10. ThinkPHP视图查询

    ThinkPHP视图查询 一.总结 1.这里的视图查询和多表查询很像,当然多表查询的话肯定要支持左右链接查询 2.view:视图的使用,关键字是view 3.sql视图功能支持:thinkphp支持视 ...