




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Erlang 学习笔记一、 Erlang语言特征重点1、catch是返回表达式的值或者错误信息的元组trycatch是可以捕捉不同的错误类型以及有流程控制2、发送消息永远不会失败,如果尝试发送消息给一个不存在的进程,只会被丢弃信息,但不会产生运行错误3、发送一个消息到不存在的“注册进程”会导致badarg错误,从而使调用进程终止。如果不想导致终止调用进程,则需使用trycatch把这个调用保护起来。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 = pn”,?Call,Call ). Test1() - ?VALUE(length(1,2,3). 详见 1709、预定义的宏 ?MODULE ?MODULE_STRING ?FIKE ?LINE ?MACHINE 详见17010、利用已定义的函数作为其他函数的参数 fun M:F/n hof1:filter(fun hof1:palin/1,2,2,2,3). 11、列表解析的保护元返回true或false12、使用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-22515、当遍历表的时候需要使用 safe_fixtable/2 锁定表,因为在遍历时具有破坏性的操作会引起运行时错误或者更糟,将导致无法预计的行为,把遍历操作封装在catch语句中是个好主意,因为我们需要保证在发生运行时错误时释放表。16、如果要发送信息给位于节点fooSTC的一个叫做frequency的进程,需要采用 frequency,fooSTC ! Message17、如果一个节点可以与其他节点通信,它被称为存货节点。用erlang:is_alive()测试本地运行时系统是否为存活状态,用net_kernel模块函数可以改变系统的存活状态,可以使用node/0内置函数找出当前节点的名字(fooSTC.local)18、长名字节点只能与其他具有长名字的节点通讯,短名字节点只能与其他具有短名字的节点通讯。19、在基本的Erlang RPC实现中,函数调用被一个消息的发送和接收代替 p25520、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=10240002、通过引用来保证请求和响应包是同一个会话 make_ref() ,它在一个节点的生命周期内几乎是唯一的,2的28次方调用后才会重复 具体详见Erlang编程指南211页三、 网上收集1、连接上了数据库之后怎么查询会这个错:mysql:fetch(p1,).* exception error: no function clause matching mysql:fetch(p1,)需要注意,官方放在googlecode的测试代码已经旧了,fetch接口实际上需要一个二进制list,所以是格式,而不是格式。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来脱离终端: -detachedStarts 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 JCLJCL是Erlang Shell的一种运行模式,即Job Control Mode (JCL, in which jobs can be started, killed, detached and connected).我们启动两个节点来完成这个操作;Node_1添加了-detached选项,启动之后直接在后台运行并没有启动Shellerl -setcookie abc -name node_123 -detachedNode_2使用了和Node_1相同的cookie,启动之后进入Erlang Shell界面erl -setcookie abc -name node_223下面我们开始在node_223演练JCL:Eshell V5.9 (abort with G)(node_223)1 node(). %当前这是在node_2node_223(node_223)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- rnode_123 %尝试连接到node_123 - j 1 shell,start,init %列出所有的Job 2* node_123,shell,start,- c 2 %这里2是job的编号,切换到job 2 Eshell V5.9 (abort with G)(node_123)1 node(). %注意提示符,现在已经是在node_1node_123(node_123)2 erlang:now().1326,801888,347570(node_123)3 %再一次Control + GUser switch command - j 1 shell,start,init 2* node_123,shell,start,- c 1 %切换到job 1(node_223)2 node(). %注意提示符,我们已经回到了node_2node_223(node_223)3 复制代码这样来来回回切换是不是有点盗梦空间的意思?是不是可以更简单一点,比如直接进入node_1呢?借助-remsh参数就可以做到看看-remsh的说明恰好是我们需要的:If you want an Erlang node to have a remote job active from the start (rather than the default local job), you start Erlang with the -remsh flag. Example: erl -sname this_node -remsh other_nodeother_host动手试一下:erl -setcookie abc -name node_323 -remsh node_123 %这样就直接进入了node_1节点注意:直接进入到了node_1,执行完操作了想要退出怎么办?你要是在这里执行一下q(). node_1这个节点就直接死掉了;正确的方法还是Ctrl+G进入JCL模式然后执行q命令退出;使用ps aux|grep node查看一下进程是不是还在ejabberd网站上提到了这个方法1 Attach an Erlang Shell to an Already Running ejabberd Process http:/www.ejabberd.im/tricks2 Interconnecting Erlang Nodes http:/www.ejabberd.im/interconnect-erl-nodes4、timer模块的大部分函数实现,依赖于一个process,如果过多使用timer,会导致这个process负载过大,影响效率。推荐使用erlang
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC TS 62607-6-35:2025 EN Nanomanufacturing - Key control characteristics - Part 6-35: Graphene-related products - Density: free-pouring,tapping and compressing method
- 【正版授权】 IEC 63522-21:2025 FR Electrical relays - Tests and measurements - Part 21: Thermal endurance
- 重庆日报课件
- 推断题-2023年中考化学解题模板
- 事故灾难应急救援指挥考核试题及答案
- 重大危险知识培训课件
- 重大危险源相关知识培训
- 老年人急诊安全救护课件
- 实验猜想与方案设计(附讲解)-中考化学实验探究新视角
- 完成句子-九年级英语上册期末冲刺专练(人教新目标)
- 全球热泵产业发展报告2025
- 商业地产项目数字化运营与客户体验提升策略研究报告
- 2025新疆天泽和达水务科技有限公司部分岗位社会招聘28人笔试模拟试题及答案解析
- 基于多元线性回归的国内旅游收入影响分析-以江西省为例
- 技术方案评审表-技术选型决策
- 中国旅游地理(第四版)中职PPT完整全套教学课件
- 统编本四年级上册语文课堂作业本参考答案
- DBJ50-T-389-2021 高性能混凝土应用技术标准
- 数据结构(c语言版)课件
- 智能消防应急照明与疏散指示系统方案
- 铁路路基重力式挡土墙施工方案
评论
0/150
提交评论