Forking de processos

Para aqueles que já leram a parte I do guia, não terão qualquer dificuldade em entender os conceitos aqui abordados. E caso também você tenha real interesse em aprender sobre concorrência, certamente já leu como funciona forking de processos em C.

Em Ruby, existe um método especial chamado fork que, na hora de ser executado, faz a chamada de sistema fork.

Vamos ver o primeiro exemplo similar ao que vimos inicialmente no módulo de C:

forking.rb
fork
puts "Hello"

Agora vamos executar o programa utilizando o interpretador CRuby chamando ruby forking.rb , que imprime:

Hello
Hello

So far, so good. Já vimos anteriormente o motivo de aparecer Hello 2 vezes. Em um outro exemplo, podemos ver que o pid é diferente dependendo se estamos no parent ou no child:

pid = fork

if pid
  puts "In parent, pid is #{Process.pid}. Child is #{pid}"
else
  puts "In child, pid is #{Process.pid}"
end
In parent, pid is 77278. Child is 77430
In child, pid is 77430

Leiam a documentação, sempre

Um exemplo mais robusto

Agora, vamos a um exemplo um pouco mais robusto com o uso de fork de processos, onde um processo pai dispara 3 processos filhos que irão executar uma tarefa que demora 2 segundos cada:

Interessante notar aqui:

  • os 3 processos filhos foram criados e iniciaram sua execução nesta ordem (78317, 78318, 78319)

  • entretanto, de acordo com as mensagens, o processo 78318 terminou antes dos outros 2

  • mas para o processo pai, o filho que terminou primeiro foi o 78317

Isto, senhoras e senhores, é a maravilha da concorrência. Não temos controle algum sobre a ordem e execução das tarefas!

Sim, vou repetir isso inúmeras vezes neste guia kk

Comunicação entre processos (IPC)

Assim como em C, podemos fazer IPC em Ruby utilizando pipes:

Este é um exemplo bastante simples de como 2 processos distintos podem conversar entre si, através da utilização de UNIX pipes.

Repare como que até o momento, conseguimos fazer em Ruby tudo o que foi possível fazer em C com relação a forking de processos, e isto se deve ao fato de que o interpretador CRuby é escrito em C, o que torna simples a interface para as syscalls envolvidas no sistema operacional.

Agora, chegou o momento de vermos as Threads em Ruby.

Last updated