terça-feira, 17 de agosto de 2010

Bye Bye forks Hello threads!!!

A algum tempo( desde perl 5.8 ), eu venho usando o módulo forks para trabalhos que envolvem multiprocessamento (ou processamento concorrente, se preferir ). O fato é que eu estava tendo muitos problemas com o forks, embora sempre tenha me dado muito bem com ele.

Só lembrando, forks é um módulo que 'sobrecarrega' o módulo threads, mas utiliza 'fork' para gerar os processos 'child' e 'parent'. Existe uma série de vantagens de usar forks ao invés de simplesmente o fork. Uma delas é a possibilidade de gerar um processo novo somente com o trecho do código que você precisa( embora outro processo seja gerado normalmente pelo S.O. ), de forma análoga as threads, além de poder compartilhar variáveis entre as 'pseudo threads' e outras coisinhas.

No entanto algumas situações me forçaram a abandonar o forks de vez. Primeiro, o sistema em que eu estava aplicando o forks não me permitia trabalhar com um daemon. Quando eu tentava executar uma tarefa, por exemplo, o módulo me gerava uma 'montanha' de mensagens de erro que envolvia inclusive permissão para sockets e outras bizarrisses.

Além do mais comecei a perceber que sem motivo aparente as 'pseudo threads' estavam parando, ou congelando. Mesmo usando eval, não consegui encontrar o problema, e foi a 'gota'!

Eu até tentei debugar isso diretamente no módulo, mas isso estava me consumindo tempo demais, já que não sou propriamente um 'guru' Perl( mas eu chego lá um dia... ), e acabei optando por testar o sistema com threads novamente.

Comecei primeiramente na minha estação, instalando a nova versão do Perl 5.12, com o thread-mode habilitado. Depois simplesmente troquei 'use forks' por 'use threads' no módulo onde eu faço o gerenciamento das antigas 'pseudo threads', levando em conta que forks tem todos os métodos que threads, como mencionei mais acima. Portanto não faria a menor diferença, certo??? Erradíssimo!! Fez TODA a diferença!!!

Diferentemente dos meus antigos testes com threads nas versões 5.8.x, tive um desempenho bem melhor, consumindo menos recurso do que usando forks. Fiz os testes executando os mesmos spiders( o sistema que eu mencionei gerencia atividades com spiders ), e medi os tempos com Datetime e Date::Calc e o consumo de memória com o comando top. Um teste superficial, admito. Mas as threads não cairam mais, e o tempo de execução diminuiu uns 3% + ou menos.

Num próximo artigo vou fazer testes com o módulo Benchmark, não percam!!!