Size: a a a

2019 November 21

AB

Alexander Bogosyan in ErlangRus
Я не хочу чтобы клиент заморачивайся этим, я хочу чтобы он сделал start и после этого получил либо ошибку либо готовый к работе pid
источник

DF

Denis Fakhrtdinov in ErlangRus
Тогда пусть висит N времени.
источник

AB

Alexander Bogosyan in ErlangRus
Ну один клиент может висеть, другое дело что остальные должны иметь возможность сделать start в это время
источник

DF

Denis Fakhrtdinov in ErlangRus
В общем, это реализуемо.
источник

AB

Alexander Bogosyan in ErlangRus
В gun такое сделано через wait_up
источник

AB

Alexander Bogosyan in ErlangRus
Но там клиент и так обязан ловить сообщения от gun
источник

AB

Alexander Bogosyan in ErlangRus
Да реализуемо конечно, и как обычно многими способами разной степени паршивости ;)
источник

DF

Denis Fakhrtdinov in ErlangRus
У тебя есть три примитива: отложенный init, монитор и ресив.
источник

DF

Denis Fakhrtdinov in ErlangRus
Не вижу паршивости совсем.
источник

IG

Ivan Gunko in ErlangRus
Denis Fakhrtdinov
Тогда я бы пользовал именно proc_lib:
init(_) ->
   % something here, supervisor awaits
   proc_lib:init_ack({ok, self()}),
   % supervisor unblocked
   % at this point you might have a message in mailbox already
   % do long stuff
   {ok, somestate}.
так родитель (супервизор в общем случае) получить два сообщения в свой мейл бокс, один из которых он обработает стандартно, а второй будет внезапным.
Это конечно можно игнорить, или даже за использовать, но как-то не супер очевидно
источник

DF

Denis Fakhrtdinov in ErlangRus
С чего бы?
источник

IG

Ivan Gunko in ErlangRus
proc_lib:init_ack({ok, self()}) - посылает сообщение родителю, что он может больше не ждать. модуль Ген сервера дергает сам эту функцию после твоего init
Вот и получиться, что твой процесс отправит два сообщения родителю
источник

DF

Denis Fakhrtdinov in ErlangRus
Да, верно. Можно пользовать proc_lib:start_link.
источник

IG

Ivan Gunko in ErlangRus
если нужно реализовтаь тоже самое что ты хотел, но без двойной отправки сообщения, нужно самому вместо gen_server:start_link вызывать proc_loib:start_link, а там самому делать гарантированно proc_lib:init_ack, затем gen_server:enter_loop
источник

DF

Denis Fakhrtdinov in ErlangRus
Но вообще у меня не было проблем с этим ни разу.
источник

DF

Denis Fakhrtdinov in ErlangRus
Да, верно.
источник

IG

Ivan Gunko in ErlangRus
ну ты успел ответить себе до)
источник

IG

Ivan Gunko in ErlangRus
вообще,  gen_server:cast(self(), init) часто делал или подобное. никаких проблем, надо просто быть способным ответить вызывающим, что ещё неготов
источник

DF

Denis Fakhrtdinov in ErlangRus
Ну есть проблема с неготовым стейтом, да.
источник

DF

Denis Fakhrtdinov in ErlangRus
То есть придётся уметь хендлить неготовый стейт с кучей undefined.
источник