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.

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!