group_registry
Organise processes into groups! Useful for pubsub.
gleam add group_registry@1
Add a group registry to your supervision tree with
group_registry.supervised
and a name that you created at the start of your
program.
import gleam/otp/actor
import gleam/otp/static_supervisor as supervisor
import group_registry
pub fn my_supervisor(name: Name(_)) -> actor.StartResult(_) {
supervisor.new(supervisor.RestForOne)
|> supervisor.add(group_registry.supervised(name))
|> supervisor.start
}
Elsewhere in your code use group_registry.get_registry
to get a reference to
the registry using the name you passed to group_registry.supervised
.
Processes can then use the group_registry.join
function to join groups.
import gleam/otp/actor
import group_registry.{type GroupRegistry}
pub fn start_actor(registry: GroupRegistry(String)) -> actor.StartResult(_) {
actor.new_with_initialiser(100, fn(_) {
// Join a group named "updates"
let self = process.self()
let subject = group_registry.join(registry, "extra-cool-processes", self)
// Add the group subject to the selector so messages will be received
actor.initialised(Nil)
|> actor.selecting(process.new_selector() |> process.select(subject))
|> Ok
})
|> actor.on_message(fn(state, message) {
io.println("Got message: " <> message)
actor.continue(state)
})
|> actor.start
}
Other processes can then publish messages to the members of the group.
import gleam/erlang/process
import group_registry.{type GroupRegistry}
pub fn publish(registry: GroupRegistry(String)) -> Nil {
// This returns a list of subjects for the processes in the group
let members = group_registry.members(registry, "extra-cool-processes")
// Send a message to each one
list.each(members, fn(member) {
process.send(member, "Hello!")
})
}
When a process terminates it is automatically cleaned up and removed from the groups in the registry.
Further documentation can be found at https://hexdocs.pm/group_registry.