Size: a a a

2019 September 14

к

кана in pro.elixir
мне хотя бы какой-нибудь предикат для серверов, terminating?, который говорит о том, что сервер еще не терминейтнулся, но :stop уже вернули
источник

к

кана in pro.elixir
окей, давайте вопрос попроще: есть ли способ проверить, жив ли процесс по его имени (не пиду)?
источник

к

кана in pro.elixir
что-то вроде Process.alive?(__MODULE__) ?
источник

AN

Anatoly Nikiforov in pro.elixir
Можешь через Process.whereis достать пид по имени, потом проверить жив ли пид
источник

к

кана in pro.elixir
спасибо
источник

к

кана in pro.elixir
сделал минимальный пример своего кода, но он работает (хоть все и срабатывает в одной мс, но в нужном порядке)

defmodule T do
 use GenServer
 require Logger

 @lifetime 100

 # run this in repl
 def test do
   ping()
   :timer.sleep(@lifetime)
   ping()
 end

 def ping do
   unless Process.whereis(__MODULE__) do
     Logger.info("starting")
     GenServer.start_link(__MODULE__, [], name: __MODULE__)
   end

   Logger.info("before call")
   GenServer.call(__MODULE__, :ping)
 end

 def init([]) do
   {:ok, [], @lifetime}
 end

 def handle_call(:ping, _, []) do
   Logger.info("in call")
   {:reply, :ok, [], @lifetime}
 end

 def handle_info(:timeout, []) do
   Logger.info("timeout")
   {:stop, :normal, []}
 end

 def terminate(:normal, []) do
   Logger.info("terminate")
 end
end

# 14:34:54.216 [info]  starting
# 14:34:54.217 [info]  before call
# 14:34:54.217 [info]  in call
# 14:34:54.326 [info]  terminate
# 14:34:54.326 [info]  starting
# 14:34:54.326 [info]  before call
# 14:34:54.326 [info]  in call
# 14:35:40.792 [info]  in call
# 14:35:40.902 [info]  timeout
# 14:35:40.902 [info]  terminate
# 14:35:40.902 [info]  starting
# 14:35:40.902 [info]  before call
# 14:35:40.902 [info]  in call
# 14:35:41.011 [info]  timeout
# 14:35:41.011 [info]  terminate
источник

к

кана in pro.elixir
кана
вот два запуска
в общем, выглядит как проблема в Registry, точнее в том, что траппинг EXIT асинхронный
источник

к

кана in pro.elixir
А вот минимальный пример с Registry падает иногда (один раз из 5)

https://gist.github.com/kana-sama/d37a3ce9c151383cb54019b5e66133f6

вот тут код и логи двух последовательных запусков теста
источник

к

кана in pro.elixir
и ошибка как видно в том, что кол срабатывает раньше таймаута и терминейта

и в целом я понимаю, что это нормально, у них одинаковый тайминг, это что-то вроде undefined behavior, я не говорю что это баг, мне скорее интересно, как сделать так, чтобы эта проблема не возникала
источник

VS

Vladimir Sekisov in pro.elixir
очевидно - нужен координатор, самописный или gproc,
например, где можно подписаться на появление регистрации
источник

IK

Ihor Katkov in pro.elixir
кана
и ошибка как видно в том, что кол срабатывает раньше таймаута и терминейта

и в целом я понимаю, что это нормально, у них одинаковый тайминг, это что-то вроде undefined behavior, я не говорю что это баг, мне скорее интересно, как сделать так, чтобы эта проблема не возникала
А какую задачу ты решаешь?
источник

к

кана in pro.elixir
абстрактная задача: я могу послать некое сообщение по айдишке юзера в сессию, для этого юзера создается сессия (если ее нет), которая умирает (и в этот момент что-то происходит со всеми сообщениями принятыми например), если сессия не получает сообщений некоторое время

то есть тот, кто посылает сообщение, не знает никаких пидов сессий, только айди юзера, и уже код в модуле сессии создает процессы сессий, если их нет
источник

к

кана in pro.elixir
ранее я это делал через ручной сервер с мапкой, и ручным удалением из мапки, когда сессия терминейтится, но вот решил заюзать регистр, который как раз это все сам делает, но вот ассинхронность отлова EXIST в registry все портит похоже
источник

к

кана in pro.elixir
но вернуть ручной регист все равно не получится, потому что все равно запрос пида идет раньше таймаута иногда
источник

к

кана in pro.elixir
ну простое костыльное решение конечно решает проблему
источник

VS

Vladimir Sekisov in pro.elixir
по идее можно GenServer.call({:via, ...}, _)
и уже его перехватывать в catch, без lookup,
обернуть call в вызов одной функции
источник

к

кана in pro.elixir
ну может быть кейс (при первом вызове всегда), когда сервера еще нет, для этого лукап, чтобы если его нет - стартануть
источник

к

кана in pro.elixir
ну ладно, в целом try-catch проблему решает, просто обернуть нужно не лукап, как я почему-то выше сделал, а call
источник
2019 September 17

DR

Dmitriy R in pro.elixir
Всем привет!) Mariaex c MySQL 8 у кого-нибудь работает?
источник

Z

Zae in pro.elixir
а что делает @impl true при объявлении функции? никак не могу нагуглить
источник