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、如果要发送信息给位于节点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 学习笔记的更多相关文章
- erlang学习笔记(shell命令)
erlang shell 命令: help(). 可以查看erlang shell内置命令. 比如:m(Mod),可以查看模块Mod. 待续..
- Programming Erlang 学习笔记(一)
入门 启动Shell 在cmd中输入命令”erl”,百分号(%)表示一个注释的开始,从百分号开始到这行结束的所有文本都被看做是注释. 一个完整的命令需要以一个句点和一个回车结束. 退出erlang的命 ...
- erlang学习笔记之基础语法
字符串是双引号,单引号的是atom元组: 下标从1开始 X = {'test1',2,3,4}. element(1,X). 配合模式匹配,可以给元素项命名,直接不用下标标记元素项 列表增删改查 增加 ...
- Erlang学习笔记2
http://wgcode.iteye.com/blog/1007623 第二章 入门 1.所有的变量都必须以大写字母开头,如果要查看某个变量,只要输入变量的名字即可,如果一个变量被赋予值,就称为绑定 ...
- erlang学习笔记
安装 Ubuntu Server上: sudo apt-get install erlang 如果安装时下载 太慢,可手工下载deb包( esl-erlang_16.a-rc1_ubuntu_prec ...
- erlang学习笔记(文件操作)
参考这里和这里了解到的文件操作的模块有很多:kernel下有:file,stdlib下有:filelib,filename,file_sorter.(具体查看官方文档)
- erlang学习笔记(2)
函数%###geometry.erl###-module(geometry). 定义-export([area/1, function1/2, function2/0, ...]).area({rec ...
- erlang学习笔记(1)
提示符erl 注释% comment 表达式123456789 * 123456789. 变量(单一赋值)X = 123456789.X.Y = X * X * X.Y.f(). 整数浮点数X = 5 ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
随机推荐
- AIX上安装Oracle10G软件
安装准备 (1)确认系统版本号.内核版本号 # oslevel –r //查看操作系统版本号 //-08能够安装10g,-09能够安装11g watermark/2/text/aHR0cDovL2 ...
- win8.1 “服务器运行失败”的解决方法
平台:win8.1 SP1 问题:安装QQ安全管家又卸载后出现了奇怪的问题,1.在桌面点右键→个性化时,提示“服务器运行失败”.2.右键点击“这台电脑”,选择“属性”时没有反应.3.开始屏幕里随便选择 ...
- POJ 3061 Subsequence 二分或者尺取法
http://poj.org/problem?id=3061 题目大意: 给定长度为n的整列整数a[0],a[1],--a[n-1],以及整数S,求出总和不小于S的连续子序列的长度的最小值. 思路: ...
- 回家过年,CSDN博客暂时歇业
CSDN博客之星2013评选活动,结束了,感谢大家的投票. 我个人只是主动拉了300票左右,2400+的票都是大家主动投的,非常感谢啊! (*^__^*) 年关将至,最近也在忙自己的事情,不再更新了. ...
- UWP 新手教程1——UWP的前世今生
文件夹 引言 设备族群 UI 和通用输入模式 通用控件和布局面板 工具 自适应扩展 通用输入处理 引言 在本篇文章中,可以掌握下面知识: 设备族群,怎样决定目标设备 新的UI控件和新面板帮助你适应不同 ...
- ITFriend月刊-第1期-2014年6月.pdf
ITFriend上线一个月了,积累了不少优质内容,本周进行了整理,制作了PDF格式的电子书. 欢迎大家下载阅读. 下载地址: CSDN下载:http://download.csdn.net/detai ...
- 【AtCoder ABC 075 A】One out of Three
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map轻松搞定 [代码] #include <bits/stdc++.h> using namespace std; ...
- Hadoop读书笔记(四)HDFS体系结构
Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的sh ...
- URL validation failed. The error could have been caused through the use of the browser's navigation
URL validation failed. The error could have been caused through the use of the browser's navigation ...
- iOS开发webView的使用一
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...