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.

A973dbbe4819b73bc6e02b05be632911?s=128

Geovane Fedrecheski

May 25, 2019
Tweet

Transcript

  1. TOP.GenServer a concorrência escondida faz seu trottoir Geovane Fedrecheski

  2. None
  3. • IoT Swarm • Caninos Loucos (aka Raspberry Pi nacional)

    • CodeIoT - Curso online gratuito de IoT • FEBRACE
  4. TOP.GenServer de volta ao

  5. None
  6. • Código sequencial versus código concorrente • Como guardamos estado?

    • O GenServer pode ajudar?
  7. Tudo é um processo

  8. Tudo é um processo

  9. Chega de Mutex, Semáforo etc.

  10. Código concorrente ainda é mais difícil que código sequencial

  11. 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
  12. 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
  13. None
  14. OTP Open Telecom Platform

  15. Introduzindo o fabuloso...

  16. 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
  17. What are the Colors? [red, blue, yellow] Colors (GenServer process)

  18. Colors (GenServer process) GenServer.call(Colors, :get_colors) [red, blue, yellow]

  19. Colors (GenServer process) spawn(fn -> . . . end)

  20. t h e c o d e

  21. None
  22. Conclusão

  23. • Código sequencial vs. concorrente • Como guardamos estado? •

    O GenServer pode ajudar?
  24. Guardamos estado em loops! e usamos send e receive para

    “nos comunicar com o loop” (na verdade um processo que vive bastante é um loop!)
  25. • Código sequencial vs. concorrente • Como guardamos estado? em

    loops • O GenServer pode ajudar?
  26. Código concorrente ainda é mais difícil que código sequencial

  27. 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
  28. 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
  29. • Código sequencial vs. concorrente separar! • Como guardamos estado?

    em loops • O GenServer pode ajudar?
  30. O GenServer abstrai a escovação de mensagens! … o que

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

    em loops • O GenServer pode ajudar? simplifica!
  32. None
  33. Obrigado ^.^ Geovane Fedrecheski | @geonnave