Buscar..


Generando un proceso simple

En el siguiente ejemplo, la función de greet dentro del módulo Greeter se ejecuta en un proceso separado:

defmodule Greeter do
    def greet do
        IO.puts "Hello programmer!"
    end
end

iex> spawn(Greeter, :greet, []) 
Hello
#PID<0.122.0>

Aquí #PID<0.122.0> es el identificador de proceso para el proceso generado.

Enviando y recibiendo mensajes

defmodule Processes do
    def receiver do
        receive do
            {:ok, val} ->
                IO.puts "Received Value: #{val}"
            _ ->
                IO.puts "Received something else"
        end
    end
end
iex(1)> pid = spawn(Processes, :receiver, [])
#PID<0.84.0>
iex(2)> send pid, {:ok, 10}
Received Value: 10
{:ok, 10}

Recursion y Recibir

La recursión puede usarse para recibir múltiples mensajes.

defmodule Processes do
    def receiver do
        receive do
            {:ok, val} ->
                IO.puts "Received Value: #{val}"
            _ ->
                IO.puts "Received something else"
        end
        receiver
    end
end
iex(1)> pid = spawn Processes, :receiver, []
#PID<0.95.0>
iex(2)> send pid, {:ok, 10}
Received Value: 10
{:ok, 10}
iex(3)> send pid, {:ok, 42}
{:ok, 42}
Received Value: 42
iex(4)> send pid, :random
:random
Received something else

Elixir utilizará una optimización de recursión de llamada de cola siempre y cuando la llamada de función sea lo último que suceda en la función como en el ejemplo.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow