Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TOP: Criando seu próprio GenServer

TOP: Criando seu próprio GenServer

Você ouve falar sobre OTP e fica perdido? Seria GenServer o nome de um novo servidor web? Já tentou usar e ficou meio assim com as callbacks todas? Nesta talk vamos construir um GenServer do zero, o que vai permitir que você: (1) entenda porque ele foi criado, (2) fortifique seu conhecimento sobre processos, e (3) saiba usar ele com mais tranquilidade nos seus códigos futuros.

Avatar for Geovane Fedrecheski

Geovane Fedrecheski

May 25, 2019
Tweet

More Decks by Geovane Fedrecheski

Other Decks in Programming

Transcript

  1. • IoT Swarm • Caninos Loucos (aka Raspberry Pi nacional)

    • CodeIoT - Curso online gratuito de IoT • FEBRACE
  2. defmodule TOP.Colors5 do def start do TOP.GenServer1.start(__MODULE__, []) end def

    get_colors do TOP.GenServer1.call(__MODULE__,:get_colors) end def handle_call(:get_colors, colors) do {colors, colors} end end
  3. defmodule TOP.GenServer2 do def start(module, initial_state \\ []) do fn

    -> loop(module, initial_state) end |> spawn() |> Process.register(module) end def call(module, query) do send(module, {:call, query, self()}) receive do reply -> reply end end def loop(module, state) do receive do {:call, query, caller} -> {reply, new_state} = mod.f(state) send(caller, reply) loop(module, new_state) {:cast, query} -> new_state = module.handle_cast(query, state) loop(module, new_state) end end end
  4. A GenServer is a process like any other Elixir process

    and it can be used to keep state, execute code asynchronously and so on. https://hexdocs.pm/elixir/GenServer.html
  5. Guardamos estado em loops! e usamos send e receive para

    “nos comunicar com o loop” (na verdade um processo que vive bastante é um loop!)
  6. defmodule TOP.GenServer2 do def start(module, initial_state \\ []) do fn

    -> loop(module, initial_state) end |> spawn() |> Process.register(module) end def call(module, query) do send(module, {:call, query, self()}) receive do reply -> reply end end def loop(module, state) do receive do {:call, query, caller} -> {reply, new_state} = ... send(caller, reply) loop(module, new_state) {:cast, query} -> new_state = module.handle_cast(query, state) loop(module, new_state) end end end
  7. defmodule TOP.Colors5 do def start do TOP.GenServer1.start(__MODULE__, []) end def

    get_colors do TOP.GenServer1.call(__MODULE__,:get_colors) end def handle_call(:get_colors, colors) do {colors, colors} end end
  8. O GenServer abstrai a escovação de mensagens! … o que

    nos deixa focar no código sequencial, e mais fácil :)
  9. • Código sequencial vs. concorrente separar! • Como guardamos estado?

    em loops • O GenServer pode ajudar? simplifica!