今天写代码,想要得到一个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}. 搞定.
分享到:
相关推荐
"Programming Erlang: Software for a Concurrent World"是Joe Armstrong编写的经典书籍,深入探讨了Erlang的设计哲学和技术细节。 在Erlang中,并发是核心特性之一。通过轻量级进程(Lightweight Processes, LWP)...
它包括Erlang虚拟机(BEAM)、进程间通信机制、错误处理工具以及一系列预先设计好的行为模式(Behaviours),如GenServer、GenEvent和Supervisor,这些模式提供了强大的容错和恢复能力。 **2. ERTS - Erlang Run-...
3. **行为模式**:如GenServer、GenEvent和Supervisor,它们提供了一种组织和管理Erlang进程的标准方式。 4. **性能优化**:探讨Erlang程序的性能调优技巧,如避免全局变量、合理利用并行性等。 5. **并发与容错**:...
为了深入了解Erlang的OOP功能,你可以阅读《Erlang程序设计》一书,或者从“Erlang的OOP功能.pdf”中获取更多详细信息。同时,“更多erlang资料下载.txt”可能包含其他有用的教程和文档链接,帮助你深入学习Erlang的...
Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心部分,它提供了一套强大的工具和库,用于构建可靠、可扩展和容错的分布式系统。OTP设计原则着重于实现高度并发、容错性和高效能。下面将详细讨论...
本文档提供了关于使用Erlang进行程序开发的一系列规则和约定。通过遵循这些规范,可以提高软件的质量、可靠性和可维护性。特别是对于那些涉及并发处理和分布式计算的应用场景来说,Erlang的强大之处在于其独特的过程...
首先,Erlang是基于函数式编程范式的语言,这意味着它使用了数学中的函数概念,每个函数都有返回值,并且在Erlang中没有显式的return语句。函数式编程的另外一个特点是不变性,也就是所有的函数参数和变量在函数被...
这可能涉及到Erlang的ETS(Erlang Term Storage)或Mnesia数据库。 6. **模块化设计**:遵循OTP原则,Timekeeper应用会被划分为多个模块,每个模块负责特定的功能,如时间获取、客户端连接管理、数据存储等,这样既...
2. **并发处理**:Erlang的轻量级进程使得在单个节点上可以并发运行成千上万个进程,这在处理大量并发连接时非常有效。"Kazoo-CCCP"可能利用这一特性实现高并发的网络服务。 3. **分布式计算**:Erlang的分布式特性...
Exercism.io 是一个在线平台,致力于通过一系列编程练习来帮助开发者提升技能,尤其是在处理细节方面。这个平台覆盖了多种编程语言,其中包括Elixir。在本文中,我们将深入探讨Elixir语言以及如何通过Exercism.io...
Elixir是一种函数式、并发、面向过程的编程语言,它运行在Erlang虚拟机(BEAM)上,特别适合构建高可用性和分布式系统。由于提供的信息有限,我们将主要探讨Elixir语言和它在开发中的应用。 Elixir语言的设计灵感...
而【描述】同样简洁地提到了"webdevhw08",没有提供额外的信息,这通常意味着具体细节可能在压缩包内的文件中。 【标签】"Elixir" 明确指出该作业或项目是使用Elixir语言进行的。Elixir是一种基于 Erlang VM 的函数...
它在Erlang VM上运行,继承了Erlang的强项,如进程间通信(IPC)、分布式计算和容错能力。Elixir的模块、宏系统以及并发特性使其在处理网络服务和实时系统时表现出色。 **3. McProtocol 库的功能** - **数据包解析...
Elixir是一种函数式、并发性和分布式编程语言,它运行在Erlang虚拟机(BEAM)上,旨在创建可扩展且高效的系统。 Elixir的挂毯项目可能是一个框架或库,用于构建Web应用程序或者图形用户界面。由于Elixir的特性,...
6. 负载均衡:为了优化集群的性能,可能需要实现负载均衡策略,确保玩家均匀地分布到各个节点上。这可以通过诸如Gossip协议、一致性哈希等方式实现。 7. 集群扩展:当玩家数量增加时,可以动态添加新节点到集群中,...
3. ** OTP(Open Telecom Platform)**:Elixir是构建在Erlang VM上的,因此可能需要了解OTP的设计原则,如GenServer、Supervisor和Agent等行为,用于构建可靠的应用。 4. **并发与并行**:Elixir的轻量级进程使得...
Elixir是一种基于Erlang虚拟机(BEAM)的现代、功能型编程语言,它以其并发性、可扩展性和容错性而闻名。在“robotex:Elixir 机器人(实验)”项目中,我们可以推测这可能是一个使用Elixir构建的机器人或者自动化...
2. **Elixir**: Elixir是一种构建可扩展和并行系统的函数式编程语言,运行在Erlang虚拟机上,具备高并发性、容错性和可维护性。Elixir与RabbitMQ结合,能够构建出强大的分布式系统。 3. **Coney**: Coney是Elixir...