你如何挂钩到 Erlang 中的应用程序
How do you hook to an application in Erlang
我不明白你如何连接到 Erlang 应用程序,因为它不 return Pid
。
考虑例如片段 below.I 正在启动一个 Pid
接收消息到 process.However 我的 application
行为没有 return 任何东西。
在使用 application
行为时,如何挂钩到我感兴趣的 Pid
?
.app
{
application,simple_app,
[
{description,"something"},
{mod,{simple_app,[]}},
{modules,[proc]}
]
}
应用程序
-module(simple_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
proc:start().
stop(_State) ->
ok.
模块
-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 我想了解如何获取根 Pid
以进一步使用它来发出命令?就我而言,我需要 proc:start
module.If 的 Pid
我的根是主管,我需要 supervisor.The 应用程序的 Pid
return一个Pid
?我如何挂钩它?
因此,问题是当启动应用程序时,我不需要 Pid
return 来发出命令吗?
您的应用程序必须依赖于 kernel
和 stdlib
。您应该在 .app
文件中定义它们的名称,例如:
{
application,simple_app,
[
{description,"something"},
{mod,{simple_app,[]}},
{modules,[proc]},
{applications, [kernel, stdlib]}
]
}
当你想启动你的应用程序时,你应该使用 application
模块,它是 kernel
应用程序的一部分。
它会启动一些进程来管理您的应用程序和 I/O 处理。它调用 YOUR_APP:start(_, _)
并且此函数必须 return 一个 Pid,它 运行 宁 supervisor
行为。我们常称它为app的root supervisor。
所以你必须定义一个 application
行为(就像你所做的那样)和一个 supervisor
行为。
这个主管进程可能会启动你的工作人员,他们正在做你的应用程序想做的任何事情。
如果你想启动一个进程,你可以在你的主管模块中定义它的启动规范。所以内核启动你的应用程序,你的应用程序启动你的主管,你的主管启动你的工人。
您可以使用名称注册您的 worker pid,并且可以使用其名称向其发送消息。
如果你有很多工人,你可以使用一个 pids 池来维护你的工人 pids。
我认为可以使用 spawn 和 spawn_link 并手动向进程发送消息。但是在生产代码中我们通常不会这样做。我们使用 OTP 行为,他们以可靠和干净的方式为我们做这件事。
我认为最好写一些 gen_server
s(另一种行为)并使用 handle_call
和 handle_cast
等回调。然后 运行 一些 gen_server
在监督树下并与监督者 API 一起杀死或终止其 children 等。然后开始编写完整的应用程序。
记得仔细阅读行为文档。
我不明白你如何连接到 Erlang 应用程序,因为它不 return Pid
。
考虑例如片段 below.I 正在启动一个 Pid
接收消息到 process.However 我的 application
行为没有 return 任何东西。
在使用 application
行为时,如何挂钩到我感兴趣的 Pid
?
.app
{
application,simple_app,
[
{description,"something"},
{mod,{simple_app,[]}},
{modules,[proc]}
]
}
应用程序
-module(simple_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
proc:start().
stop(_State) ->
ok.
模块
-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 我想了解如何获取根 Pid
以进一步使用它来发出命令?就我而言,我需要 proc:start
module.If 的 Pid
我的根是主管,我需要 supervisor.The 应用程序的 Pid
return一个Pid
?我如何挂钩它?
因此,问题是当启动应用程序时,我不需要 Pid
return 来发出命令吗?
您的应用程序必须依赖于 kernel
和 stdlib
。您应该在 .app
文件中定义它们的名称,例如:
{
application,simple_app,
[
{description,"something"},
{mod,{simple_app,[]}},
{modules,[proc]},
{applications, [kernel, stdlib]}
]
}
当你想启动你的应用程序时,你应该使用 application
模块,它是 kernel
应用程序的一部分。
它会启动一些进程来管理您的应用程序和 I/O 处理。它调用 YOUR_APP:start(_, _)
并且此函数必须 return 一个 Pid,它 运行 宁 supervisor
行为。我们常称它为app的root supervisor。
所以你必须定义一个 application
行为(就像你所做的那样)和一个 supervisor
行为。
这个主管进程可能会启动你的工作人员,他们正在做你的应用程序想做的任何事情。
如果你想启动一个进程,你可以在你的主管模块中定义它的启动规范。所以内核启动你的应用程序,你的应用程序启动你的主管,你的主管启动你的工人。
您可以使用名称注册您的 worker pid,并且可以使用其名称向其发送消息。
如果你有很多工人,你可以使用一个 pids 池来维护你的工人 pids。
我认为可以使用 spawn 和 spawn_link 并手动向进程发送消息。但是在生产代码中我们通常不会这样做。我们使用 OTP 行为,他们以可靠和干净的方式为我们做这件事。
我认为最好写一些 gen_server
s(另一种行为)并使用 handle_call
和 handle_cast
等回调。然后 运行 一些 gen_server
在监督树下并与监督者 API 一起杀死或终止其 children 等。然后开始编写完整的应用程序。
记得仔细阅读行为文档。