`
idning
  • 浏览: 138510 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于erlang supervisor ,书上没有讲到的细节

阅读更多


今天写代码,想要得到一个supervisor下面挂的所有 worker数量,

我 通过dynamic的方式启动这些worker的:
    XXWorker = {"xx_worker" ++ util:uuid(),
             {xx_worker, start_link,[Task]},
             temporary, 5000, worker, dynamic},
    ?DEBUG("sup before call start_child~n", []),
    supervisor:start_child(xx_sup, XXWorker),
%xx_sup是一个已经启动的gen_server.

查 api,找到这个函数:which_children(SupRef) -> [{Id,Child,Type,Modules}]
但 是我自己用这个函数,却总是不能得到worker进程,
?VALUE(supervisor:which_children(xx_sup) ),
app_mon可以得到进程树,于是我想用app_mon里面的方法,未果,
后来看 supervisor的代码,
do_start_child_i(M, F, A) ->
    case catch apply(M, F, A) of
    {ok, Pid} when is_pid(Pid) ->
        {ok, Pid};
    {ok, Pid, Extra} when is_pid(Pid) ->
        {ok, Pid, Extra};
    ignore ->
        {ok, undefined};
    {error, Error} ->
        {error, Error};
    What ->
        {error, What}
    end.

handle_call({start_child, EArgs}, _From, State) when ?is_simple(State) ->
    #child{mfa = {M, F, A}} = hd(State#state.children),
    Args = A ++ EArgs,
    case do_start_child_i(M, F, Args) of
    {ok, Pid} ->
        NState = State#state{dynamics =
                 ?DICT:store(Pid, Args, State#state.dynamics)},
        {reply, {ok, Pid}, NState};
    {ok, Pid, Extra} ->
        NState = State#state{dynamics =
                 ?DICT:store(Pid, Args, State#state.dynamics)},
        {reply, {ok, Pid, Extra}, NState};
    What ->
        {reply, What, State}
    end;
就 是说,要M:F(A) 返回的结果是个{ok, Pid} 才会被加入到DICT里面去,
supervisor:which_children()的 时候才会出来,
而我自己的xx_work:start_link() 只是简单的返回了ok.
再看看其它 gen_server:start_link(), 都是这样写的:
start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
查gen_server源码,发现它的start_link 返回就是:  {'ok', pid()} | 'ignore' | {'error', term()}

于是,我把自己的 xx_work:start_link()  返回{ok, Pid}. 搞定.
分享到:
评论

相关推荐

    erlang 设计指南

    "Programming Erlang: Software for a Concurrent World"是Joe Armstrong编写的经典书籍,深入探讨了Erlang的设计哲学和技术细节。 在Erlang中,并发是核心特性之一。通过轻量级进程(Lightweight Processes, LWP)...

    erlang otp 19.1 官网文档 HTML格式

    它包括Erlang虚拟机(BEAM)、进程间通信机制、错误处理工具以及一系列预先设计好的行为模式(Behaviours),如GenServer、GenEvent和Supervisor,这些模式提供了强大的容错和恢复能力。 **2. ERTS - Erlang Run-...

    erlang 中文,chm参考文档

    3. **行为模式**:如GenServer、GenEvent和Supervisor,它们提供了一种组织和管理Erlang进程的标准方式。 4. **性能优化**:探讨Erlang程序的性能调优技巧,如避免全局变量、合理利用并行性等。 5. **并发与容错**:...

    Erlang的OOP功能

    为了深入了解Erlang的OOP功能,你可以阅读《Erlang程序设计》一书,或者从“Erlang的OOP功能.pdf”中获取更多详细信息。同时,“更多erlang资料下载.txt”可能包含其他有用的教程和文档链接,帮助你深入学习Erlang的...

    Erlang OTP设计原理文档 中文版本

    Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心部分,它提供了一套强大的工具和库,用于构建可靠、可扩展和容错的分布式系统。OTP设计原则着重于实现高度并发、容错性和高效能。下面将详细讨论...

    erlang 编程规范

    本文档提供了关于使用Erlang进行程序开发的一系列规则和约定。通过遵循这些规范,可以提高软件的质量、可靠性和可维护性。特别是对于那些涉及并发处理和分布式计算的应用场景来说,Erlang的强大之处在于其独特的过程...

    Erlang初学:Erlang的一些特点和个人理解总结

    首先,Erlang是基于函数式编程范式的语言,这意味着它使用了数学中的函数概念,每个函数都有返回值,并且在Erlang中没有显式的return语句。函数式编程的另外一个特点是不变性,也就是所有的函数参数和变量在函数被...

    timekeeper:ErlangOTP的游戏时钟应用程序

    这可能涉及到Erlang的ETS(Erlang Term Storage)或Mnesia数据库。 6. **模块化设计**:遵循OTP原则,Timekeeper应用会被划分为多个模块,每个模块负责特定的功能,如时间获取、客户端连接管理、数据存储等,这样既...

    kazoo-cccp

    2. **并发处理**:Erlang的轻量级进程使得在单个节点上可以并发运行成千上万个进程,这在处理大量并发连接时非常有效。"Kazoo-CCCP"可能利用这一特性实现高并发的网络服务。 3. **分布式计算**:Erlang的分布式特性...

    exercism:处理细节中的魔鬼(exercism.io)

    Exercism.io 是一个在线平台,致力于通过一系列编程练习来帮助开发者提升技能,尤其是在处理细节方面。这个平台覆盖了多种编程语言,其中包括Elixir。在本文中,我们将深入探讨Elixir语言以及如何通过Exercism.io...

    hop-stop

    Elixir是一种函数式、并发、面向过程的编程语言,它运行在Erlang虚拟机(BEAM)上,特别适合构建高可用性和分布式系统。由于提供的信息有限,我们将主要探讨Elixir语言和它在开发中的应用。 Elixir语言的设计灵感...

    webdevhw08

    而【描述】同样简洁地提到了"webdevhw08",没有提供额外的信息,这通常意味着具体细节可能在压缩包内的文件中。 【标签】"Elixir" 明确指出该作业或项目是使用Elixir语言进行的。Elixir是一种基于 Erlang VM 的函数...

    McProtocol:Elixir的Minecraft协议实现

    它在Erlang VM上运行,继承了Erlang的强项,如进程间通信(IPC)、分布式计算和容错能力。Elixir的模块、宏系统以及并发特性使其在处理网络服务和实时系统时表现出色。 **3. McProtocol 库的功能** - **数据包解析...

    挂毯

    Elixir是一种函数式、并发性和分布式编程语言,它运行在Erlang虚拟机(BEAM)上,旨在创建可扩展且高效的系统。 Elixir的挂毯项目可能是一个框架或库,用于构建Web应用程序或者图形用户界面。由于Elixir的特性,...

    ex_mmo_cluster:Elixir测试中的MMO服务器群集

    6. 负载均衡:为了优化集群的性能,可能需要实现负载均衡策略,确保玩家均匀地分布到各个节点上。这可以通过诸如Gossip协议、一致性哈希等方式实现。 7. 集群扩展:当玩家数量增加时,可以动态添加新节点到集群中,...

    cs4550hw09

    3. ** OTP(Open Telecom Platform)**:Elixir是构建在Erlang VM上的,因此可能需要了解OTP的设计原则,如GenServer、Supervisor和Agent等行为,用于构建可靠的应用。 4. **并发与并行**:Elixir的轻量级进程使得...

    robotex:Elixir 机器人(实验)

    Elixir是一种基于Erlang虚拟机(BEAM)的现代、功能型编程语言,它以其并发性、可扩展性和容错性而闻名。在“robotex:Elixir 机器人(实验)”项目中,我们可以推测这可能是一个使用Elixir构建的机器人或者自动化...

    锥:具有消息发布功能的RabbitMQ的消费者服务器

    2. **Elixir**: Elixir是一种构建可扩展和并行系统的函数式编程语言,运行在Erlang虚拟机上,具备高并发性、容错性和可维护性。Elixir与RabbitMQ结合,能够构建出强大的分布式系统。 3. **Coney**: Coney是Elixir...

Global site tag (gtag.js) - Google Analytics