I do not understand how do you hook to an Erlang application since it does not return the Pid
.
Consider for example the snippet below.I am starting a Pid
which receives messages to process.However my application
behaviour does not return anything. How do i hook to the Pid
i am interested in when using application
behaviour ?
.app
{
application,simple_app,
[
{description,"something"},
{mod,{simple_app,[]}},
{modules,[proc]}
]
}
app
-module(simple_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
proc:start().
stop(_State) ->
ok.
module
-module(proc).
-export([start/0]).
start()->
Pid=spawn_link(?MODULE,loop,[]),
{ok,Pid}.
loop()->
receive
{From,Message}-> From ! {ok,Message},
loop();
_ ->loop()
end.
P.S I am trying to understand how do i get the root Pid
to further use it to issue commands ? In my case i need the Pid
of the proc:start
module.If my root was a supervisor , i would need the Pid
of the supervisor.The application does not return a Pid
? How do i hook to it ? The question thus is when starting the application wouldn't i need a Pid
returned by it to then be able to issue commands against?
1条答案
按热度按时间2uluyalo1#
您的应用程序必须依赖于
kernel
和stdlib
。您应该在.app
文件中定义它们的名称,例如:当您要启动应用程序时,你应该使用
application
模块,它是kernel
应用程序的一部分。它启动一些进程来管理你的应用程序和I/O处理。它调用YOUR_APP:start(_, _)
,并且这个函数必须返回一个运行supervisor
行为的Pid。我们通常称它为应用程序的根管理器。所以你必须定义一个application
行为(如您所做的)和supervisor
行为。此主管进程可能会启动您的工作进程,这些工作进程正在执行您的应用希望执行的任何操作。如果您要启动进程,你可以在你的管理模块中定义它的启动规范,所以内核启动你的应用,你的应用启动你的管理,你的管理启动你的工作者(s)。您可以用一个名称注册您的worker pid,并且可以使用它的名称向它发送消息。如果您有很多worker,您可以使用一个pid池来维护您的worker pid。我认为使用spawn和spawn_link并手动向进程发送消息是可以的。但在生产代码中,我们通常不这样做。我们使用OTP行为,它们以可靠和干净的方式为我们做这些。
我认为最好写一些
gen_server
(另一种行为),并使用handle_call
和handle_cast
等回调函数。然后在一个监督树下运行一些gen_server
,并使用监督API杀死或终止它的孩子,等等。然后开始写一个完整的应用程序。请务必仔细阅读行为说明文件。