在Erlang shell中,flush()
可以用来获取shell进程的消息队列.
是否可以通过了解其PID来了解另一个进程的消息队列长度?
今天为了捕获错误问题,我已阅读erlang's
错误和错误处理文档.
对于生成的错误类型,有两种类型,一种是exit
,另一种是throw
.在点击我的源代码之后,throw and exit
表达式已经集中了.
两者都相似,似乎只是捕捉匹配表达是不同的.
(emacs@chen-yumatoMacBook-Pro.local)30> catch throw ({aaa}).
{aaa}
(emacs@chen-yumatoMacBook-Pro.local)31> catch exit ({aaa}).
{'EXIT',{aaa}}
(emacs@chen-yumatoMacBook-Pro.local)32> catch gen_server:call(aaa,{aaa}).
{'EXIT',{noproc,{gen_server,call,[aaa,{aaa}]}}}
Run Code Online (Sandbox Code Playgroud)
你能告诉我什么时候使用throw以及何时使用exit?
我已经习惯用pc来开发erlang程序,一个是mac os x 10.6,另一个是mac os x 10.7.
在".emacs"
两个pc的文件中,它包含以下脚本
;;handle emacs utf-8 input
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
Run Code Online (Sandbox Code Playgroud)
但是当我在一台电脑中输入包含汉字的备注并保存,然后下载到另一台电脑.中文字符无法正确显示.反向操作的相同故事.
我想知道如何检查当前文件的编码类型?有没有命令可以做到这一点?
仔细研究"gproc"项目的gproc_tests.erl文件时.我找到了以下代码."再见"消息在"erlang:monitor/2"之前发送,我认为有可能不会收到"DOWN"消息.这是对的吗?如果是这样,应该切换两条线,对吧?
t_simple_aggr_counter() ->
?assert(gproc:reg({c,l,c1}, 3) =:= true),
?assert(gproc:reg({a,l,c1}) =:= true),
?assert(gproc:get_value({a,l,c1}) =:= 3),
P = self(),
P1 = spawn_link(fun() ->
gproc:reg({c,l,c1}, 5),
P ! {self(), ok},
receive
{P, goodbye} -> ok
end
end),
receive {P1, ok} -> ok end,
?assert(gproc:get_value({a,l,c1}) =:= 8),
?assert(gproc:update_counter({c,l,c1}, 4) =:= 7),
?assert(gproc:get_value({a,l,c1}) =:= 12),
P1 ! {self(), goodbye}, %<<===========This line
R = erlang:monitor(process, P1), %<<======This line
receive {'DOWN', R, _, _, _} ->
gproc:audit_process(P1)
end,
?assert(gproc:get_value({a,l,c1}) =:= 7).
Run Code Online (Sandbox Code Playgroud) 在项目gproc的文件gen_leader.erl中,创建了自定义行为.但在下面的陈述中,什么是模块"gen"?我在"erlang文档工具http://www.erlang.org/erldoc "中找不到这个模块?你能给我一些解释吗?
behaviour_info(callbacks) ->
[{init,1},
{elected,2},
{surrendered,3},
{handle_leader_call,4},
{handle_leader_cast,3},
{handle_local_only, 4},
{from_leader,3},
{handle_call,3},
{handle_cast,2},
{handle_DOWN,3},
{handle_info,2},
{terminate,2},
{code_change,4}];
behaviour_info(_Other) ->
undefined.
start_link(Name, [_|_] = CandidateNodes, Workers,
Mod, Arg, Options) when is_atom(Name) ->
gen:start(?MODULE, link, {local,Name}, Mod, %<<++++++ What's the meaning?
{CandidateNodes, Workers, Arg}, Options).
Run Code Online (Sandbox Code Playgroud) 当测试开源项目'gproc'函数时,我发现list_to_pid对于本地pid是好的,而对于远程pid则不行.我的erlang运行时是R15B.
(dist_test_n2@yus-iMac.local)29> D = list_to_pid("<0.239.0>").
<0.239.0>
(dist_test_n2@yus-iMac.local)30> D == self(). %% equal here
true
(dist_test_n2@yus-iMac.local)31> f(E).
ok
(dist_test_n2@yus-iMac.local)32> E = gproc:where(Name).
<8969.239.0>
(dist_test_n2@yus-iMac.local)33> F = list_to_pid("<8969.239.0>").
<8969.239.0>
(dist_test_n2@yus-iMac.local)34> F == E. %% not equal here
false
Run Code Online (Sandbox Code Playgroud)
从用户指南有关此功能,没有这样的限制.是bug吗?
在决定一个客户端参数结构到一个OTP
gen_server 时,是否需要将Pid
和 都Node name
插入到参数结构中?
给定一个遥控器pid
,是否可以转换pid
为node name
?我的意思是完整的节点名称,例如"emacs@yus-iMac.local".
在狮子OS上,安装后,运行时会发生错误.首先,不使用rabbitmq-env.config file
,首先"sudo rabbitmq-server"
,以下消息显示:
yus-iMac:rabbitmq yuchen$ sudo rabbitmq-server
Activating RabbitMQ plugins ...
********************************************************************************
********************************************************************************
0 plugins activated:
ERROR: epmd error for host "yus-iMac": address (unable to establish tcp connection)
Run Code Online (Sandbox Code Playgroud)
然后我添加rabbitmq-env.conf
文件.内容如下:
RABBITMQ_NODENAME=rabbitb@yus-iMac.local
When starting, another error message is given:
yus-iMac:rabbitmq yuchen$ sudo rabbitmq-server
Activating RabbitMQ plugins ...
********************************************************************************
********************************************************************************
0 plugins activated:
{error_logger,{{2012,5,26},{21,47,13}},"Can't set short node name!\n Please check your configuration\n",[]}
Run Code Online (Sandbox Code Playgroud)
我认为该消息意味着无法使用短节点.但我不知道如何控制rabbitmq-server
使用name
,而不是sname
?
在rabbitmq的源代码中,有一个文件,名为"rabbit_log.erl".它可以自定义不同模块的日志级别.自定义由应用程序环境实现.
例如,在.erlang
文件中:
application:set_env(rabbit,log_levels,
[{default,info},{aaa_connection,error}]).
Run Code Online (Sandbox Code Playgroud)
只有aaa_connection
模块会显示"错误"级别,其他模块将显示"信息"级别模块.
我想知道可以在basho/lager
app中自定义模块的日志级别吗?