O que é um processo em Elixir?

o-que-e-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

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:

Image description

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.

Total
0
Shares
Leave a Reply

Your email address will not be published. Required fields are marked *

Previous Post
best-api-documentation-tools-you need

Best API documentation tools you need

Next Post
tips/tricks-for-a-beginner-to-git/github

Tips/Tricks for a beginner to Git/GitHub

Related Posts