Я с трудом пытаюсь разобраться в модели разработки OTP, поскольку я конвертирую некоторый код в приложение OTP.
По сути, я делаю поисковый робот и просто не Я совершенно не знаю, где разместить код, который выполняет фактическую работу.
У меня есть супервизор, который запускает моего рабочего:
-behaviour(supervisor).
-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}).
init(_Args) ->
Children = [
?CHILD(crawler, worker)
],
RestartStrategy = {one_for_one, 0, 1},
{ok, {RestartStrategy, Children}}.
В этом дизайне Crawler Worker отвечает за выполнение фактической работы:
-behaviour(gen_server).
start_link() ->
gen_server:start_link(?MODULE, [], []).
init([]) ->
inets:start(),
httpc:set_options([{verbose_mode,true}]),
% gen_server:cast(?MODULE, crawl),
% ok = do_crawl(),
{ok, #state{}}.
do_crawl() ->
% crawl!
ok.
handle_cast(crawl}, State) ->
ok = do_crawl(),
{noreply, State};
do_crawl порождает довольно большое количество процессов и запросов, которые обрабатывают работу сканирования через http.
Вопрос, в конечном счете, таков: где собственно сканирование должно происходить? Как видно выше, я экспериментировал с различными способами запуска реальной работы, но все еще упускал некоторую концепцию, необходимую для определения того, как все сочетается друг с другом.
Примечание: часть сантехники OTP опущена для краткости - вся сантехника есть, и вся система висит вместе