<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vinicius Moreira</title>
    <description>The latest articles on DEV Community by Vinicius Moreira (@viniciuslm).</description>
    <link>https://dev.to/viniciuslm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F853708%2Fa3ff552e-b652-48c3-8e14-548b6ea6f564.jpeg</url>
      <title>DEV Community: Vinicius Moreira</title>
      <link>https://dev.to/viniciuslm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/viniciuslm"/>
    <language>en</language>
    <item>
      <title>Testando os tipos de Strategy do Supervisor do Elixir</title>
      <dc:creator>Vinicius Moreira</dc:creator>
      <pubDate>Fri, 24 Jun 2022 01:00:22 +0000</pubDate>
      <link>https://dev.to/viniciuslm/testando-os-tipos-de-strategy-do-supervisor-do-elixir-4jfc</link>
      <guid>https://dev.to/viniciuslm/testando-os-tipos-de-strategy-do-supervisor-do-elixir-4jfc</guid>
      <description>&lt;p&gt;Vamos testar o comportamento dos 3 tipos de Strategy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;:one_for_one&lt;/strong&gt; (Se um processo filho terminar, apenas este processo será reiniciado)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;:one_for_all&lt;/strong&gt; (Se um processo filho terminar, todos os outros filhos serão terminados e depois, todos os processos seráo reiniciados, inclusive, o processo que terminou)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;:rest_for_one&lt;/strong&gt; (Se um processo filho terminar, todos os filhos que foram criados depois dele serão finalizados e os mesmos serão reiniciados, inclusive, o processo que terminou)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;mix new test_otp --sup&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwc9etcg3zdu8b4s3gbw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwc9etcg3zdu8b4s3gbw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testando :one_for_one
&lt;/h2&gt;

&lt;p&gt;Vamos configurar no application para os processos sejam criados nessa orderm:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ProcessA&lt;br&gt;
ProcessB&lt;br&gt;
ProcessC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos iniciar cada processo com o estado: [0]&lt;/p&gt;

&lt;p&gt;Por padrão, o &lt;strong&gt;strategy:&lt;/strong&gt; já vem como &lt;strong&gt;:one_for_one&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;test_otp/application.ex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule TestOtp.Application do
  # See https://hexdocs.pm/elixir/Application.html
  # for more information on OTP Applications
  @moduledoc false

  use Application

  @impl true
  def start(_type, _args) do
    children = [
      # Starts a worker by calling: TestOtp.Worker.start_link(arg)
      # {TestOtp.Worker, arg}
      Core.ProcessA,
      Core.ProcessB,
      Core.ProcessC
    ]

    # See https://hexdocs.pm/elixir/Supervisor.html
    # for other strategies and supported options
    opts = [strategy: :one_for_one, name: TestOtp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;criar o ProcessA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;test_otp/core/process_a.ex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule Core.ProcessA do
  use GenServer

  # Server

  @impl true
  def init(state) do
    {:ok, state}
  end

  @impl true
  def handle_call(:get, _from, state) do
    {:reply, state, state}
  end

  @impl true
  def handle_cast({:add, items}, state) do
    {:noreply, state ++ items}
  end

  # Client

  def start_link(_) do
    GenServer.start_link(__MODULE__, [0], name: ProcessA)
  end

  def get() do
    GenServer.call(ProcessA, :get)
  end

  def add() do
    GenServer.cast(ProcessA, {:add, [1,2,3])
  end
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;criar o ProcessB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;test_otp/core/process_b.ex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule Core.ProcessB do
  use GenServer

  # Server

  @impl true
  def init(state) do
    {:ok, state}
  end

  @impl true
  def handle_call(:get, _from, state) do
    {:reply, state, state}
  end

  @impl true
  def handle_cast({:add, items}, state) do
    {:noreply, state ++ items}
  end

  # Client

  def start_link(_) do
    GenServer.start_link(__MODULE__, [0], name: ProcessB)
  end

  def get() do
    GenServer.call(ProcessB, :get)
  end

  def add() do
    GenServer.cast(ProcessB, {:add, [4,5,6])
  end
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;criar o ProcessC&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;test_otp/core/process_c.ex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule Core.ProcessC do
  use GenServer

  # Server

  @impl true
  def init(state) do
    {:ok, state}
  end

  @impl true
  def handle_call(:get, _from, state) do
    {:reply, state, state}
  end

  @impl true
  def handle_cast({:add, items}, state) do
    {:noreply, state ++ items}
  end

  # Client

  def start_link(_) do
    GenServer.start_link(__MODULE__, [0], name: ProcessC)
  end

  def get() do
    GenServer.call(ProcessC, :get)
  end

  def add() do
    GenServer.cast(ProcessC, {:add, [4,5,6])
  end
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos iniciar a aplicaçao com o &lt;strong&gt;IEX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;iex -S mix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro do &lt;strong&gt;IEX&lt;/strong&gt;, vamos digitar&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.add&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Depois, vamos conferir o estado dos processos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.get&lt;/code&gt;&lt;br&gt;
[0,1,2,3]&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
[0,4,5,6]&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;br&gt;
[0,7,8,9]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8rq9095gy5el23mu1eo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8rq9095gy5el23mu1eo.png" alt="Image description"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Agora, vamos parar o &lt;strong&gt;ProcessB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Digite no &lt;strong&gt;IEX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GenServer.stop(ProcessB)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos conferir o estado dos processos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.get&lt;/code&gt;&lt;br&gt;
[0,1,2,3]&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
[0]&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;br&gt;
[0,7,8,9]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek0lnrbgqbutglvihyew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek0lnrbgqbutglvihyew.png" alt="Image description"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Percebemos que apenas o &lt;strong&gt;ProcessB&lt;/strong&gt; voltou ao estado inicial, ou seja, apenas ele foi reiniciado.&lt;/p&gt;
&lt;h2&gt;
  
  
  Testando :one_for_all
&lt;/h2&gt;

&lt;p&gt;Para isso, vamos mudar apenas o &lt;strong&gt;strategy:&lt;/strong&gt; no arquivo test_otp/application.ex, vamos colocar &lt;strong&gt;strategy: :one_for_all&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;test_otp/application.ex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule TestOtp.Application do
  # See https://hexdocs.pm/elixir/Application.html
  # for more information on OTP Applications
  @moduledoc false

  use Application

  @impl true
  def start(_type, _args) do
    children = [
      # Starts a worker by calling: TestOtp.Worker.start_link(arg)
      # {TestOtp.Worker, arg}
      Core.ProcessA,
      Core.ProcessB,
      Core.ProcessC
    ]

    # See https://hexdocs.pm/elixir/Supervisor.html
    # for other strategies and supported options
    opts = [strategy: :one_for_all, name: TestOtp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos iniciar a aplicaçao com o &lt;strong&gt;IEX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;iex -S mix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro do &lt;strong&gt;IEX&lt;/strong&gt;, vamos digitar&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.add&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Depois, vamos conferir o estado dos processos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.get&lt;/code&gt;&lt;br&gt;
[0,1,2,3]&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
[0,4,5,6]&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;br&gt;
[0,7,8,9]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2u54shmdu9v0df7xlu0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2u54shmdu9v0df7xlu0.png" alt="Image description"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Agora, vamos parar o &lt;strong&gt;ProcessB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Digite no &lt;strong&gt;IEX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GenServer.stop(ProcessB)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos conferir o estado dos processos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.get&lt;/code&gt;&lt;br&gt;
[0]&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
[0]&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;br&gt;
[0]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzw6lut33sfddlkjerpqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzw6lut33sfddlkjerpqd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Percebemos que todos os processos voltaram ao estado inicial, ou seja, todos foram finalizados e reiniciados.&lt;/p&gt;
&lt;h2&gt;
  
  
  Testando :rest_for_one
&lt;/h2&gt;

&lt;p&gt;Vamos mudar apenas o &lt;strong&gt;strategy:&lt;/strong&gt; no arquivo test_otp/application.ex, vamos colocar &lt;strong&gt;strategy: :rest_for_one&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;test_otp/application.ex&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defmodule TestOtp.Application do
  # See https://hexdocs.pm/elixir/Application.html
  # for more information on OTP Applications
  @moduledoc false

  use Application

  @impl true
  def start(_type, _args) do
    children = [
      # Starts a worker by calling: TestOtp.Worker.start_link(arg)
      # {TestOtp.Worker, arg}
      Core.ProcessA,
      Core.ProcessB,
      Core.ProcessC
    ]

    # See https://hexdocs.pm/elixir/Supervisor.html
    # for other strategies and supported options
    opts = [strategy: :rest_for_one, name: TestOtp.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos iniciar a aplicaçao com o IEX&lt;/p&gt;

&lt;p&gt;&lt;code&gt;iex -S mix&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro do &lt;strong&gt;IEX&lt;/strong&gt;, vamos digitar&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.add&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Depois, vamos conferir o estado dos processos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.get&lt;/code&gt;&lt;br&gt;
[0,1,2,3]&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
[0,4,5,6]&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;br&gt;
[0,7,8,9]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8rq9095gy5el23mu1eo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8rq9095gy5el23mu1eo.png" alt="Image description"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Agora, vamos parar o &lt;strong&gt;ProcessB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Digite no &lt;strong&gt;IEX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GenServer.stop(ProcessB)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agora, vamos conferir o estado dos processos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Core.ProcessA.get&lt;/code&gt;&lt;br&gt;
[0,1,2,3]&lt;br&gt;
&lt;code&gt;Core.ProcessB.add&lt;/code&gt;&lt;br&gt;
[0]&lt;br&gt;
&lt;code&gt;Core.ProcessC.add&lt;/code&gt;&lt;br&gt;
[0]&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplzw6nbpnbmi8a8y9vp4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplzw6nbpnbmi8a8y9vp4.png" alt="Image description"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Percebemos que apenas o &lt;strong&gt;ProcessB&lt;/strong&gt; e o &lt;strong&gt;ProcessC&lt;/strong&gt;) voltaram ao estado inicial. O &lt;strong&gt;ProcessB&lt;/strong&gt; foi parado, por isso, foi reiniciado, já o &lt;strong&gt;ProcessC&lt;/strong&gt;, que foi criado depois do &lt;strong&gt;ProcessB&lt;/strong&gt;, vejam no arquivo application.ex, foi finalizado e reiniciado. E o &lt;strong&gt;ProcessA&lt;/strong&gt;, que foi criado antes do ProcessB, manteve o seu estado, ou seja, não foi reiniciado.&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>genserver</category>
      <category>supervisor</category>
    </item>
  </channel>
</rss>
