Forking de processos

Para aqueles que já leram a parte I do guiaarrow-up-right, 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 Carrow-up-right.

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çãoarrow-up-right, 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 pipesarrow-up-right:

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