Forking de processos
Last updated
Last updated
Para aqueles que já leram a , 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 .
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:
Agora vamos executar o programa utilizando o interpretador CRuby chamando ruby forking.rb
, que imprime:
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:
Leiam a , sempre
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
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.
Assim como em C, podemos fazer IPC em Ruby utilizando :