O que é um processo em Elixir?
Elixir UTFPR (por Adolfo Neto)
Posted on March 4, 2023
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
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"))
?
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"))
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
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:
Em primeiro lugar, veja que
fn -> 1 end
retornou uma espécie de "código" que identifica a função:
#Function<43.3316493/0 in :erl_eval.expr/6>
E
spawn(fn -> 1 end)
retornou um PID, um Process IDentifier, um identificador de processo:
#PID<0.120.0>
Eu posso atribuir este PID a uma variável:
iex(1)> pid = spawn(fn -> 1 end)
#PID<0.110.0>
E depois perguntar se o processo que foi gerado está vivo:
iex(2)> Process.alive?(pid)
false
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>
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
Mas se pergunto novamente depois de 10 segundos, a resposta será não.
iex(5)> Process.alive?(pid)
false
Se eu fizer isto aqui
iex(6)> pid = spawn(fn -> Process.sleep(10000); IO.puts("Adolfo") end)
#PID<0.117.0>
Adolfo
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>
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.
Posted on March 4, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.