[Erlang 0094] Erlang 杂记 VI
最近一直忙Storm相关的东西,今天抽时间整理一下Erlang笔记,这一次的内容主要是一些开源项目:Mock ,worker pool......
$ kerl list releasesGetting the available releases from erlang.org...R10B-0 R10B-2 R10B-3 R10B-4 R10B-5 R10B-6 R10B-7 R10B-8 R10B-9 R11B-0 R11B-1R11B-2 R11B-3 R11B-4 R11B-5 R12B-0 R12B-1 R12B-2 R12B-3 R12B-4 R12B-5 R13AR13B R13B01 R13B02 R13B03 R13B04 R14A R14B R14B01 R14B02Run "./kerl update releases" to update this list from erlang.org
项目地址: https://github.com/spawngrid/kerl
Reia is a Ruby-like scripting language for the Erlang virtual machine. Reia brings you the best of both worlds between Ruby's friendly syntax, reflection, metaprogramming, and the amazing power of blocks, and Erlang's immense abilities for concurrency, distribution, hot code swapping, and fault tolerance.Reia's source code is available on Github. There are no releases and thus no direct download links yet, sorry! See the README on Github for instructions on how to build Reia from source.项目地址: http://reia-lang.org/ Erlang Meet Javascript Node.js着实让Javascript又火了一把 ,Erlang与Javascript又会擦出什么火花? 看看
![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015180.png)
![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
defmodule Hello do IO.puts "Defining the function world" def world do IO.puts "Hello World" end IO.puts "Function world defined"endHello.world
![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
项目地址: http://elixir-lang.org/
相关链接: http://expm.co/ Lua Luerl - an implementation of Lua in Erlang https://github.com/rvirding/luerl Joxa A Modern Lisp for the Erlang VM https://github.com/ericbmerritt/joxa![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
Eshell V5.8.4 (abort with ^G)1> meck:new(dog).ok2> meck:expect(dog, bark, fun() -> "Woof!" end).ok3> dog:bark()."Woof!"4> meck:validate(dog).true5> meck:unload(dog).ok6> dog:bark().** exception error: undefined function dog:bark/07> meck:expect(dog, meow, fun() -> meck:exception(error, not_a_cat) end).ok8> catch dog:meow().{'EXIT',{not_a_cat,[{meck,exception,2}, {meck,exec,4}, {dog,meow,[]}, {erl_eval,do_apply,5}, {erl_eval,expr,5}, {shell,exprs,6}, {shell,eval_exprs,6}, {shell,eval_loop,3}]}}9> meck:validate(dog).true![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
项目地址: https://github.com/eproxus/meck
还有一个gen_server_mock.erl 也可以看一下: https://github.com/jashmenn/gen_server_mock
![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
init([]) -> {ok, Pools} = application:get_env(example, pools), PoolSpecs = lists:map(fun({Name, SizeArgs, WorkerArgs}) -> PoolArgs = [{name, {local, Name}}, {worker_module, example_worker}] ++ SizeArgs, poolboy:child_spec(Name, PoolArgs, WorkerArgs) end, Pools), {ok, {{one_for_one, 10, 10}, PoolSpecs}}.squery(PoolName, Sql) -> poolboy:transaction(PoolName, fun(Worker) -> gen_server:call(Worker, {squery, Sql}) end).equery(PoolName, Stmt, Params) -> poolboy:transaction(PoolName, fun(Worker) -> gen_server:call(Worker, {equery, Stmt, Params}) end).
项目地址: https://github.com/devinus/poolboy/tree/0.9.1 常识一则:获取gen_server gen_fsm的运行时Status 这应该算是常识不算技巧了,使用sys:get_status/1,可以获取gen_server等运行时的值.下面是process_info和sys:get_status的结果对比;这里使用的fsm_demo.erl是一个gen_fsm的程序.记录一下,我总是忘记它所在的模块; ![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
Eshell V5.9 (abort with ^G)1> fsm_demo:start(abc).{ok,<0.34.0>}2> {_,Pid}=v(1).{ok,<0.34.0>}3> erlang:process_info(Pid).[{registered_name,fsm_demo},{current_function,{gen_fsm,loop,7}},{initial_call,{proc_lib,init_p,5}},{status,waiting},{message_queue_len,0},{messages,[]},{links,[]},{dictionary,[{'$ancestors',[<0.32.0>]}, {'$initial_call',{fsm_demo,init,1}}]},{trap_exit,false},{error_handler,error_handler},{priority,normal},{group_leader,<0.25.0>},{total_heap_size,233},{heap_size,233},{stack_size,10},{reductions,20},{garbage_collection,[{min_bin_vheap_size,46368}, {min_heap_size,233}, {fullsweep_after,65535}, {minor_gcs,0}]},{suspending,[]}]4> sys:get_status(fsm_demo).{status,<0.34.0>, {module,gen_fsm}, [[{'$ancestors',[<0.32.0>]}, {'$initial_call',{fsm_demo,init,1}}], running,<0.34.0>,[], [{header,"Status for state machine fsm_demo"}, {data,[{"Status",running}, {"Parent",<0.34.0>}, {"Logged events",[]}, {"StateName",locked}]}, {data,[{"StateData",{[],abc}}]}]]}5> ![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
2012年12月18日 14:10:24 补记
![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
Eshell V5.9 (abort with ^G)1> T={a,12,"good_man",<<2,3,4>>}.{a,12,"good_man",<<2,3,4>>}2> io:format("Data Dump:~p",[T]).Data Dump:{a,12,"good_man",<<2,3,4>>}ok3> rd(a,{age,name,desc}).a4> io:format("Data Dump:~p",[T]).Data Dump:{a,12,"good_man",<<2,3,4>>}ok5> T2=T.#a{age = 12,name = "good_man",desc = <<2,3,4>>}6> io:format("Data Dump:~p",[T2]).Data Dump:{a,12,"good_man",<<2,3,4>>}ok7> io:format(io_lib_pretty:print(T, fun(a, 3) -> [age,name,desc] end)).#a{age = 12,name = "good_man",desc = <<2,3,4>>}ok8> ![[Erlang 0094] Erlang 散记 VI](http://img.reader8.net/uploadfile/jiaocheng/20140140/2729/2014012718291015181.gif)
2012-12-19 21:55 补记
今天群里面有人问到:一个进程被压了很多消息,处理速度变慢,开启了SMP更慢,何解?
这个和timer的情况很类似:
Creating timers using