start/0 и start/2 в модулях с поведением application

101 views
Skip to first unread message

Роман А.

unread,
Aug 30, 2012, 11:05:44 AM8/30/12
to erlang-...@googlegroups.com
Здравствуйте, знатоки!

У начинающего эрлангера очередной вопрос. В некоторых примерах кода, например в простом сервере вебсокетов к Cowboy в модуле приложения описываются две коллбэк-функции start/0 и start/2. Я смутно догадываюсь, в какой последовательности они вызываются и примерно зачем нужны (моя гипотеза - отделить куски кода для запуска на одной ноде или распределённо). Но хотелось бы знать это наверняка. Ведь по идее, можно было бы и ограничиться start/2 - как сделано в подавляющем большинстве примеров кода, которые встречаются на Github, например. 

Увы, в офф.документации и в книжке Томпсона и Чезарини этот вопрос никак не раскрыт. Может быть, это устарело и так уже не делают?

Заранее спасибо!

Alexander Dergachev

unread,
Aug 30, 2012, 11:12:21 AM8/30/12
to erlang-...@googlegroups.com
start/0 пишут чтобы была возможность быстро запустить приложение из шелл скрипта erl -s application_name (без сборки релиза), так что она к поведению application никак не относится.

2012/8/30 Роман А. <romkasi...@gmail.com>

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
 
 



--
With Best Regards,
Alexander Dergachev

Alexander Valinurov

unread,
Aug 30, 2012, 11:18:05 AM8/30/12
to erlang-...@googlegroups.com
На самом деле это очень удобная штука. Если надо запустить приложение
с параметрами - то запускают start/2, если без (либо с параметрами по
умолчанию) - то start/0.

пример

start() ->
DefArg1 = arg1,
DefArg2 = arg2,
?MODULE:start(DefArg1, DefArg2).

start(Arg1, Arg2) ->
...


30 августа 2012 г., 19:12 пользователь Alexander Dergachev
<cy6er...@gmail.com> написал:

Роман А.

unread,
Aug 30, 2012, 11:27:39 AM8/30/12
to erlang-...@googlegroups.com
Однако ж, всё оказалось сильно проще, чем я думал.

Спасибо за ответы!

четверг, 30 августа 2012 г., 19:12:43 UTC+4 пользователь Alexander Dergachev написал:

Dmitry Groshev

unread,
Aug 30, 2012, 2:16:06 PM8/30/12
to erlang-...@googlegroups.com

Это не совсем верно, см. ответ Александра Дергачёва.

Roman Chvanikov

unread,
Aug 30, 2012, 11:25:14 AM8/30/12
to erlang-...@googlegroups.com
start/2 - один из обязательных колбэков для поведения (behaviour) "application" (второй обязательный колбэк - stop/1), подробнее здесь: http://www.erlang.org/doc/design_principles/applications.html
start/0 - точка входа, которая используется по-умолчанию при вызове "erl -s my_application" (будет вызвана функция my_application:start/0). Хотя также в erl можно передать любую иную функцию с произвольными аргументами. Подробнее здесь: http://linux.die.net/man/1/erl

Max Lapshin

unread,
Aug 30, 2012, 2:32:21 PM8/30/12
to erlang-...@googlegroups.com
Да, я тоже не знаю о чём пишет Валинуров. start/2 — коллбек от
application, а start/0 — дефолтная функция, которую вызывает erl при
ключе -s

Alexander Valinurov

unread,
Aug 30, 2012, 3:03:18 PM8/30/12
to erlang-...@googlegroups.com
Макс, ну я теперь совсем себя неуверенно чувствую. Тогда здесь что?
https://github.com/iamaleksey/oserl/blob/master/test/test_mc.erl#L100
Я про этот принцип говорил.

30 августа 2012 г., 22:32 пользователь Max Lapshin
<max.l...@gmail.com> написал:
> Да, я тоже не знаю о чём пишет Валинуров. start/2 -- коллбек от
> application, а start/0 -- дефолтная функция, которую вызывает erl при
> ключе -s
>

Volodymyr Stolyarchuk

unread,
Aug 31, 2012, 2:08:25 AM8/31/12
to erlang-...@googlegroups.com
-behaviour(gen_mc).

а вопрос вроде бы был о application

2012/8/30 Alexander Valinurov <valin...@gmail.com>:

--
С уважением, Владимир Столярчук
тим-лидер отдела поддержки продаж

RIA.ua
тел./факс.: 0 432 555-200 (многоканальный)
моб: 0 (93) 279-17-45
e-mail:Volodymyr....@ria.ua

Роман А.

unread,
Aug 31, 2012, 4:00:22 AM8/31/12
to erlang-...@googlegroups.com
Ну тогда вот ещё что интересно: если нужно стартануть в своём приложении, например cowboy, mnesia, и прочее - их надо стартовать и в start/0 и прописывать в кортеже registered в ресурсном файле?

четверг, 30 августа 2012 г., 19:05:44 UTC+4 пользователь Роман А. написал:

Max Lapshin

unread,
Aug 31, 2012, 4:02:27 AM8/31/12
to erlang-...@googlegroups.com
Я смутно понимаю, что такое «кортеж registered», но если очень хочется
пользоваться релизами, то там start/0 не вызывается.

Я всё стартую из start/2 головного приложения. Может это и неправильно.

Volodymyr Stolyarchuk

unread,
Aug 31, 2012, 4:07:32 AM8/31/12
to erlang-...@googlegroups.com
в примера ковбоя написано так:

start() ->
ok = application:start(cowboy),
ok = application:start(hello_world).

тогда, я так понимаю ковбой стартует вместе с приложением

а по поводу registered, может вы имели в виду прописывать в applications?
{applications, [
kernel,
stdlib,
cowboy
]},

2012/8/31 Роман А. <romkasi...@gmail.com>:

> --
> --
> Страница рассылки: http://groups.google.com/group/erlang-russian
> Новости: http://erlanger.ru
> Чат: xmpp://erl...@conference.jabber.ru
> Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
>
> Написать письмо: erlang-...@googlegroups.com
> Отписаться: erlang-russia...@googlegroups.com
>
>

--
С уважением, Владимир Столярчук
тим-лидер отдела поддержки продаж

RIA.ua
тел./факс.: 0 432 555-200 (многоканальный)
моб: 0 (93) 279-17-45

e-mail:Volodymyr....@gmail.com

Роман А.

unread,
Aug 31, 2012, 4:15:22 AM8/31/12
to erlang-...@googlegroups.com
Да, Ковбоевский пример меня и сбил с толку. Там описаны и обе стартовые функциии и в ресурсном файле в applications (простите, что перепутал его с registered). Получается, что приложение cowboy запускается дважды? Или ресурсный фай при запуске через  erl -s <Application> не учитывается? И запуск приложения там производится через шелку с erl -s 

пятница, 31 августа 2012 г., 12:07:34 UTC+4 пользователь Volodymyr Stolyarchuk написал:

Maxim Treskin

unread,
Aug 31, 2012, 4:20:10 AM8/31/12
to erlang-...@googlegroups.com
Если хочется запустить без создания релиза (так удобно в процессе разработки), то приложения надо запускать в функции start/0.
Деплоить удобнее с помощью релизов, тогда все приложения-зависимости надо записывать в app-файл, они будут запускаться при старте релиза.

2012/8/31 Роман А. <romkasi...@gmail.com>
--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
 
 



--
Max Treskin

Max Lapshin

unread,
Aug 31, 2012, 4:26:09 AM8/31/12
to erlang-...@googlegroups.com
2012/8/31 Maxim Treskin <zert...@gmail.com>:

> Если хочется запустить без создания релиза (так удобно в процессе
> разработки), то приложения надо запускать в функции start/0.
> Деплоить удобнее с помощью релизов,

Вот тут я готов спорить =)

Maxim Treskin

unread,
Aug 31, 2012, 4:30:03 AM8/31/12
to erlang-...@googlegroups.com
С чем? Что деплоить лучше релизами? Давай :)

2012/8/31 Max Lapshin <max.l...@gmail.com>
--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru

Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com





--
Max Treskin

Роман А.

unread,
Aug 31, 2012, 4:31:07 AM8/31/12
to erlang-...@googlegroups.com
Вот я прямо сейчас разглядываю репозитарии Ejabberd и RabbitMQ и пытаюсь понять, как их-то стартуют? bash-скриптов в репозитарии я не нашёл сходу. Как вообще надо правильно стартовать Erlang-приложения в продуктиве?

пятница, 31 августа 2012 г., 12:26:11 UTC+4 пользователь Max Lapshin написал:

Maxim Treskin

unread,
Aug 31, 2012, 4:34:19 AM8/31/12
to erlang-...@googlegroups.com
Надо смотреть init-скрипты. Они почти у каждого дистрибутива Linux свои.

2012/8/31 Роман А. <romkasi...@gmail.com>

--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
 
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
 
 



--
Max Treskin
Reply all
Reply to author
Forward
0 new messages