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.
Top comments (0)