Paralelismo com GPars

Eder Leite
SynchroTEC
Published in
2 min readJan 10, 2017

Fala galera, tudo certo?

Tempos atrás, estava atendendo um chamado onde usuário relatava que ao fazer a integração de dados do sistema origem para o nosso sistema, eventualmente, geravam criticas de validação incorretamente, críticas que não condiz ao verdadeiro estado do registro.

Depois de alguns dias analisando, debugando código, tentando entender o que estava acontecendo, encontrei o problema. Para encurtar o “causo”, o problema ocorria devido ao paralelismo utilizado pelo processo de integração de dados.

Este processo usava um utilitário que mantinha, por um curto espaço de tempo, estado em seus atributos, fazendo com que uma thread usa-se dados de outra thread, causando assim o problema.

Nota: Ao usar paralelismo, tome muito cuidado com objetos estáticos ou singleton que mantem estados em seus atributos, isso pode te dar uma bela dor de cabeça.

Dado o inusitado fato, tivemos a necessidade de se criar um teste para garantir que isso não mais iria ocorrer. Mas como simular várias threads executando o mesmo código ao mesmo tempo?

É para responder essas e outras perguntas que o GPars Framework foi criado.

GPars é uma biblioteca de código aberto para Java e Groovy para resolver problemas de concorrência e paralelismo e lhe dá uma série de abstrações de alto nível para escrever e posteriormente executar código simultâneo e paralelo.

Algumas das features são:

  • Map/Reduce;
  • Fork/Join;
  • Asynchronous Closures;
  • Actors;
  • Agents;
  • Dataflow Concurrency;
  • Other Concepts.

Já usamos o GPars em outras partes do sistema, assim usei-o também no teste.

Meu teste ficou assim:

Após correção no Utilitário que mantinha estado, consegui com este teste garantir que o problema não correria em uma execução em paralelo.

Na linha 5, através do GPars, criei um poll de execuções. Na linha 6, pedi para o GPars executar cada um dos códigos CFOPs da lista ([‘5101’, ‘5201’, ‘6101’, ‘6201’]) em paralelo, aqui foram criados 4 threads, uma para cada código, fazendo o loop dez mil vez, caso o código fosse diferente do esperado pelo menos uma vez o teste falha.

Nas linhas 13 e 14, foi acionado uma catch, para pegar eventuais exceções lançadas em uma das threads.

Vemos no exemplo a cima que é muito simples usar o GPars para executar “coisas” em paralelo, estão aproveite e use!

Abraços.

Originally published at edermfl.wordpress.com on Maio 16, 2016.

--

--