DEV Community

Cover image for O que é um processo em Elixir?
Elixir UTFPR (por Adolfo Neto)
Elixir UTFPR (por Adolfo Neto)

Posted on

O que é um processo em Elixir?

Para aprender o que é um processo em Elixir, antes você tem que saber o que é uma função.

Por exemplo, IO.puts/1 é uma função que escreve algo na tela. A função se chama puts, ela está no módulo IO (de entrada I e saída O) e ela recebe um argumento:

iex(1)> IO.puts("Adolfo")
Adolfo
:ok
Enter fullscreen mode Exit fullscreen mode

Se tudo dá certo ela retorna o átomo :ok.
Uma função que te permite gerar (tradução talvez imprecisa de spawn, em inglês) é Kernel.spawn/1.

Novamente, o nome dela é spawn, ela faz parte do módulo Kernel e recebe um argumento.
Eu consigo fazer

Kernel.spawn(IO.puts("Adolfo"))
Enter fullscreen mode Exit fullscreen mode

?
Não!

Vamos começar simplificando: toda função que faz parte do módulo Kernel não precisa do nome do módulo antes.
Basta chamar

spawn(IO.puts("Adolfo"))
Enter fullscreen mode Exit fullscreen mode

Vai continuar errado mas com menos letras.
O que Kernel.spawn/1 recebe é uma função de aridade 0, ou seja, que não recebe nenhum argumento.
Como fazemos isso?
Assim:

fn -> 1 end
Enter fullscreen mode Exit fullscreen mode

A função acima não tem nome (anônima) e retorna 1.

Mas veja na imagem que se você dá um spawn nela, nada de interessante acontece:

Image description

Em primeiro lugar, veja que

fn -> 1 end
Enter fullscreen mode Exit fullscreen mode

retornou uma espécie de "código" que identifica a função:

#Function<43.3316493/0 in :erl_eval.expr/6>
Enter fullscreen mode Exit fullscreen mode

E

spawn(fn -> 1 end)
Enter fullscreen mode Exit fullscreen mode

retornou um PID, um Process IDentifier, um identificador de processo:

#PID<0.120.0>
Enter fullscreen mode Exit fullscreen mode

Eu posso atribuir este PID a uma variável:

iex(1)> pid = spawn(fn -> 1 end)
#PID<0.110.0>
Enter fullscreen mode Exit fullscreen mode

E depois perguntar se o processo que foi gerado está vivo:

iex(2)> Process.alive?(pid)
false
Enter fullscreen mode Exit fullscreen mode

Não está pois era uma função muito rápida, que só retornava 1.
Eu posso, por exemplo, fazer o processo "dormir" por 10 segundos antes de retornar o 1.

iex(3)> pid = spawn(fn -> Process.sleep(10000); 1 end)
#PID<0.113.0>
Enter fullscreen mode Exit fullscreen mode

Se rapidamente eu pergunto se o processo, cujo identificador está na variável pid, está vivo, a resposta é sim.

iex(4)> Process.alive?(pid)
true
Enter fullscreen mode Exit fullscreen mode

Mas se pergunto novamente depois de 10 segundos, a resposta será não.

iex(5)> Process.alive?(pid)
false
Enter fullscreen mode Exit fullscreen mode

Se eu fizer isto aqui

iex(6)> pid = spawn(fn -> Process.sleep(10000); IO.puts("Adolfo") end)
#PID<0.117.0>
Adolfo
Enter fullscreen mode Exit fullscreen mode

vai demorar 10 segundos para "Adolfo" ser escrito na tela.

Já se eu fizer isto, será imediato para "Adolfo" aparecer na tela.

iex(7)> pid = spawn(fn -> IO.puts("Adolfo") end)
Adolfo
#PID<0.119.0>
Enter fullscreen mode Exit fullscreen mode

Enfim, isto é somente o básico do básico. Leia mais em
https://elixirschool.com/pt/lessons/intermediate/concurrency
Ou no Getting Started da linguagem Elixir
https://elixir-lang.org/getting-started/processes.html

Fiz tudo isso sem sequer mencionar send e receive.

Finalizando: um processo em Elixir é uma unidade de processamento que executa uma função.

Top comments (0)