Skip to content

Instantly share code, notes, and snippets.

@sultaniman
Created April 30, 2020 17:35
Show Gist options
  • Save sultaniman/cb61797b61b83de17bcb27f136d33e4d to your computer and use it in GitHub Desktop.
Save sultaniman/cb61797b61b83de17bcb27f136d33e4d to your computer and use it in GitHub Desktop.
How to create dynamic supervisor with registry
# Your actual dynamic worker
defmodule Awesome.Worker do
use GenServer, restart: :transient
alias Awesome.Hero
# Client
def start_link(%Hero{} = hero), do:
GenServer.start_link(@mod, hero, name: proc_name(hero))
defp proc_name(%Hero{name: name}), do:
{:via, Registry, {HeroRegistry, "v-#{name}"}}
end
# Supervisor manages your workers
defmodule Awesome.HeroSupervisor do
use DynamicSupervisor
alias Awesome.Worker
# Client
def start_link(arg), do:
DynamicSupervisor.start_link(@mod, arg, name: @mod)
def join(%Hero{} = hero), do:
DynamicSupervisor.start_child(@mod, {HeroWorker, hero})
# Server
def init(_arg), do:
DynamicSupervisor.init(strategy: :one_for_one)
end
# application.ex
defmodule Awesome.Application do
# ...
def start(_type, _args) do
children = [
{Awesome.HeroSupervisor, []},
{Registry, keys: :unique, name: HeroRegistry}
]
Supervisor.start_link(children, @opts)
end
end
defmodule Awesome.Worker do
use GenServer, restart: :transient
alias Awesome.Hero
# Client
def start_link(%Hero{} = hero), do:
GenServer.start_link(@mod, hero, name: proc_name(hero))
defp proc_name(%Hero{name: name}), do:
{:via, Registry, {HeroRegistry, "v-#{name}"}}
end
@AUGERClement
Copy link

AUGERClement commented Apr 10, 2025

Seems interesting as a demo, but the Hero struct is not defined, and the module Awesome.Worker is pasted twice.
I'll try to make it work on my end and maybe propose a Merge if I manage to have something working

Edit : I managed to make a small demo working out of it. Here is the repo https://github.com/AUGERClement/HeroSupervisor
Would be glad to update your gist with it if you wish

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment