小编mwt*_*mwt的帖子

查询Erlang进程的状态?

Erlang中的一个常见模式是维护状态的递归循环:

loop(State) ->
  receive
    Msg ->
      NewState = whatever(Msg),
      loop(NewState)
  end.
Run Code Online (Sandbox Code Playgroud)

有没有办法用bif或跟踪查询正在运行的进程的状态?由于崩溃消息说"......状态是......"并显示崩溃进程的状态,我认为这很容易,但我很失望,因为我无法找到这样做的bif.

那么,我认为使用dbg模块的跟踪就可以了.不幸的是,我相信因为这些循环是尾调用优化的,所以dbg只捕获对该函数的第一次调用.

有解决方案吗

erlang

15
推荐指数
3
解决办法
9999
查看次数

什么是最好的开源Erlang项目/文件供新手阅读?

我正在寻找一些轻读.对于那些拥有比我更多Erlang经验的人来说,在网上读出的最佳源文件是什么?如果有人只是从阅读原始资源中学习正确的Erlang/OTP原则,那么他应该从哪个代码开始,以及他应该在哪里进行深入和深入的理解?

erlang open-source

15
推荐指数
1
解决办法
3704
查看次数

你如何在gen_servers中进行选择性接收?

我把我的大部分应用移植到了OTP行为,但是我被卡住了.我无法弄清楚如何使用gen_server进行选择性接收.如果没有回调函数子句与消息匹配,而不是将消息放回邮箱中,则会出错!

现在,无论我走到哪里,人们都会选择接受.我去的每个地方,人们都称赞OTP.你真的不能同时拥有这两个吗?这不是一个重大的,可纠正的缺点吗?

erlang程序员如何处理这个问题?

编辑(回应zed的评论):

这是一个示例,我希望看到按排序顺序打印的整数列表:

-module(sel_recv).
-behaviour(gen_server).

-export([start_link/0]).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
     terminate/2, code_change/3]).

-export([test/0]).

start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

test() ->
    gen_server:cast(?MODULE, test).

init([]) ->
    {ok, 0}.

handle_call(_Request, _From, State) ->
    Reply = ok,
    {reply, Reply, State}.

handle_cast(test, _State) ->
    lists:map(fun(N) ->
                      gen_server:cast(?MODULE, {result, N})
              end, [9,8,7,6,5,4,3,2,1]),
    {noreply, [1,2,4,5,6,7,8,9]};
handle_cast({result, N}, [N|R]) ->
    io:format("result: " ++ integer_to_list(N) ++ "~n"),
    {noreply, R}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.
Run Code Online (Sandbox Code Playgroud)

当然,在我的真实应用程序中,存在计时器延迟,并且需要按顺序处理的消息与其他消息交错.特别是,我发送了http请求,有时是多次发送,有时一次发送一次,间隔时间间隔.无论如何,我需要按顺序收集它们.

erlang

7
推荐指数
2
解决办法
2242
查看次数

你如何参数化gen​​_server模块?

编辑:

我不打算使用参数作为构建Erlang程序的通用方法 - 我仍在学习传统的设计原则.我也不想模仿OOP.我唯一的观点是让我的gen_server调用在服务器实例之间保持一致.这似乎更像是修复了一个破碎的抽象给我.我可以想象一个语言或OTP使得使用任何gen_server实例的api变得方便的世界,这是我想要生活的世界.

感谢Zed表明我的主要目标是可行的.


谁能想出一种在gen_servers上使用参数化模块的方法?在下面的示例中,假设test_child是具有一个参数的gen_server.当我尝试启动它时,我得到的是:

42> {test_child, "hello"}:start_link().
** exception exit: undef
     in function  test_child:init/1
        called as test_child:init([])
     in call from gen_server:init_it/6
     in call from proc_lib:init_p_do_apply/3
Run Code Online (Sandbox Code Playgroud)

最后,我试图想出一种方法来使用gen_server的多个命名实例.据我所知,一旦你开始这样做,就不能再使用漂亮的API了,必须使用gen_server:call和gen_server:cast在你的实例中抛出消息.如果我可以告诉实例他们的名字,这个问题可以缓解.

erlang

5
推荐指数
3
解决办法
1723
查看次数

标签 统计

erlang ×4

open-source ×1