Size: a a a

2021 November 28

SP

Sergey Prokhorov in ErlangRus
Но если у воркера init/1 медленный то так лучше не делать, т.к. supervisor:start_child блокирующий.
источник

SP

Sergey Prokhorov in ErlangRus
Как альтернатива, можно сперва стартовать воркера и после этого уже отправлять его pid регистратору.
Другая опция - чтобы воркер сам себя регистрировал из init.
источник

SP

Sergey Prokhorov in ErlangRus
А воркеры реально должны перезапускаться если упали? Оно идемпотентно там всё будет?
источник

JM

Jonn Mostovoy in ErlangRus
естественно!
источник

SB

S B in ErlangRus
Да, там на каждом шагу что-то может пойти не так, предугадать все ошибки невозможно и есть чёткое понимание «начального состояния», в котором можно переродиться.
источник

LL

Lama Lover in ErlangRus
Можно init перенести в handle_continue ещё
источник

MK

Matwey Kornilov in ErlangRus
или timeout послать, если эрланг очень старый
источник

MK

Matwey Kornilov in ErlangRus
Господа. Мне нужно ваше одобрение или неодобрение. Совет, короче. У меня есть порт, который умеет делать всякое, но уходит в себя на несколько минут, когда выполняет задания разные. Вокруг этого порта есть gen_server обертка, который всем вопрошающим call-ами отвечает {error, busy}, если порт уже выполняет какое-то дело. Это сделано, чтобы всё не заблокировать и не плодить непонятные огромные таймауты в коде. Если порт ничего не делает, то я запускаю работу, отвечаю ok, и потом через ! шлю этому процессу результат работы, когда готово. Меня вот всё-таки такое смущает.
источник

ML

Maksim Lapshin in ErlangRus
Я делал менеджер задач, который никогда не блокируется и проксирует запросы к пулу таких портов.

На вход ему прилетают запросы с заявленным таймаутом, а он отвечает чуть-чуть раньше, что поставить задачу на исполнение не получилось и надо еще раз
источник

DF

Denis Fakhrtdinov in ErlangRus
Рабочий подход. Разве что чуть более generic решение — это отдавать вместе с задачей функцию-коллбек, которая сделает что нужно.
источник

DF

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

ML

Maksim Lapshin in ErlangRus
Тут как раз хороший доклад от кларны: что может пойти не так с коллбеками :)
источник

DF

Denis Fakhrtdinov in ErlangRus
Коллбеки тоже не идеальны, конечно :) Но в это случае я бы таки положил в api коллбек.
источник

SB

S B in ErlangRus
А мне вот нипанятна. Разве call по определению не должен быть блокирующим вызовом?
Cast неблокирующий. Зачем их путать?
источник

MK

Matwey Kornilov in ErlangRus
cast не возвращает результат, а call возвращает. А надо же как-то сообщить клиенту, что мы делать ничего не станем.
источник

SB

S B in ErlangRus
ReplyTo.
источник

𝕊

𝕊𝕖𝕣𝕘𝕖𝕚... in ErlangRus
А ещё cast не проверяет, есть вообще такой процесс, насколько я помню. Т.е. просто отправка сообщения
источник

𝕊

𝕊𝕖𝕣𝕘𝕖𝕚... in ErlangRus
Я делал очередь запросов внутри генсервера. Но это up to you, как говорится. Мы же не знаем всей вашей подноготной
источник

𝕊

𝕊𝕖𝕣𝕘𝕖𝕚... in ErlangRus
Кстати, таймеры не нужны, если использовать время жизни в абсолютных значениях
источник

MK

Matwey Kornilov in ErlangRus
Вот я боюсь, что очередь может забиться работой на пол дня вперёд, результатов которой никто не дождётся в итоге...
источник