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:
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 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