Ir para conteúdo
rogerss_7

Processamento Paralelo

Recommended Posts

Pessoal, estou participando do desenvolvimento de uma ferramenta com a minha equipe que fará, entre outras, coisas automatizadas por serviços.

 

Neste contexto eu comecei a notar que algumas estratégias poderiam ser diferentes, como por exemplo processamento paralelo, coisa esta que não está acontecendo.

 

Vou tentar dar exemplos sem poder mostrar trechos de código reais, pois existem contratos de confidencialidade que poderiam nos levar a multas ou rescisão, acho que vocês entenderão.

 

1 - Suponha que eu tenha X usuários (logins);
2 - Pra cada usuário eu tenho que verificar se tem e-mails pra enviar ou arquivos pra processar, entre outros etc.;

 

// Implementação hipotética

1 - Existe uma List<Logins> que é iterada por um foreach básico;

2 - Dentro deste foreach são chamadas as ações que podem acontecer pra cada usuário, mais ou menos assim:

foreach (var login in logins)
{
    if (!await _servicoLoginInjetado.LogIn(login))
    {
        continue;
    }

    await _servicoLoginInjetado.MandarEmail();
    await _servicoLoginInjetado.ProcessarArquivos();
    await _servicoLoginInjetado.FazerOutraCoisa();
}

É possível notar que existe uma predisposição para async, porém o código não é nada performático, pois itera um a um, não existe paralelismo.

 

As informações do login (logado) ficam internamente no objeto retornante de _servicoLoginInjetado ... talvez isto também esteja errado.

 

Gostaria de trocar experiências de possíveis melhorias com vocês.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Mayara Andres
      Olá, preciso implementar um código java usando threads, como o anunciado da atividade pede: 
       
      "O trabalho consiste em alterar o código que busca valores dentro de um vetor (disponível no blackboard) de forma a criar N threads de acordo com a vontade do usuário (ler o número de threads que o usuário deseja criar) e buscar um valor no vetor (apenas 1, também inserido pelo usuário) de forma paralela, ou seja, cada thread criada deve procurar por um região diferente do vetor. Ao final da execução mostre qual foi a thread que encontrou o valor."
       
      PS: EU SÓ QUERO SABER POR ONDE EU COMEÇO, A LÓGICA EU ENTENDI, SÓ NÃO SEI COMO FAZER. 

      classe thread_busca
       
      package trabalho_thread; import java.util.logging.Level; import java.util.logging.Logger; class ThreadBusca extends Thread { private int vetor[]; private int numeroProcurar; public ThreadBusca(int[] vet, int numeroProcurar) { this.vetor = vet; this.numeroProcurar = numeroProcurar; } @Override public void run() { for (int i = 0; i < vetor.length; i++) { if (vetor[i] == numeroProcurar) { System.out.println("Indice de "+numeroProcurar+" eh "+i); return; } try { Thread.sleep(10); } catch (InterruptedException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println("Indice de "+numeroProcurar+" eh -1"); } } classe main
      package trabalho_thread; import java.util.Arrays; import java.util.Random; import javax.swing.JOptionPane; public class Main { public static void main(String[] args) { int vet[] = new int[200]; Random random = new Random(); for(int i=0;i<200;i++){ vet[i] = random.nextInt(4999)+1; } System.out.println(Arrays.toString(vet)); int numero=-1; do{ numero = Integer.parseInt(JOptionPane.showInputDialog("Numero a pesquisar:")); new ThreadBusca(vet, numero).start(); }while(numero>0); } }  
    • Por Igor1788
      Galera, to compartilhando um curso mega útil.
       
      Em uma página web moderna pode conter diversas imagens e muitas vezes essas nem chegam a ser vistas pelo usuário, pois o mesmo pode clicar em um link e já navegar para outro conteúdo, não é verdade? No desenvolvimento de uma aplicação web, por exemplo, acabamos carregando todas as imagens mesmo sem necessidade, o que atrapalha e muito o tempo de carregamento e aumenta o consumo de banda desnecessariamente. Existe uma técnica chamada Lazy Load que resolve exatamente esse problema, ou seja, as imagens são carregadas apenas quando aparecem na área visível do navegador.

      https://preview.ibb.co/kEwDOH/curso_lazy_load_1.png 
      https://preview.ibb.co/jOiciH/curso_lazy_load_2.png 

      Se liga aqui para ver os cursos, completos e grátis:

      https://youtu.be/86wxusfp000 
      https://youtu.be/IKznPWVgDKg 
      https://youtu.be/8JW2kH4spk0 
      https://youtu.be/NWE_2Sz7cjg 
      https://youtu.be/R3ZwASzR0m8 
      https://youtu.be/BBqD-oJTg7s
    • Por chrislix
      Alguem poderia me ajudar?
      estou tentando multiplicar duas matrizes, A e B
      e salvar o resultado em C
      o resultado nao ta certo, to usando thread
      so queria uma opinião para saber se ta certo o que to fazendo, pq o que ta me intrigando eh que os valores da linha da matriz C nao altera
      #include<stdio.h> #include<stdlib.h> #include<pthread.h> pthread_t thread_1; pthread_t thread_2; pthread_t thread_3; int a[3][2] = {{1, 4}, {2, 5}, {3, 6}}; int b[2][3] = {{7, 8, 9}, {10, 11, 12}}; int c[3][3] = {{1, 2, 3}, {0, 0, 0}, {0, 0, 0}}; void* tarefa_1(void *p) { printf("\nThread1\n"); for (int col = 0; col < 3; col++) { // Multiplica a linha de A pela coluna de B. for (int i = 0; i < 2; i++) { c[1][col] += a[1][i] * b[i][col]; } printf("%i\t",c[1][col]); printf("\n"); } } void* tarefa_2(void *p) { printf("\nThread2\n"); for (int col = 0; col < 3; col++) { // Multiplica a linha de A pela coluna de B. for (int i = 0; i < 2; i++) { c[2][col] += a[2][i] * b[i][col]; } printf("%i\t",c[2][col]); printf("\n"); } } void* tarefa_3(void *p) { printf("\nThread3\n"); for (int col = 0; col < 3; col++) { // Multiplica a linha de A pela coluna de B. for (int i = 0; i < 2; i++) { c[3][col] += a[3][i] * b[i][col]; } printf("%i\t",c[3][col]); printf("\n"); } } int main() { printf("Inicio das Threads...\n"); // inicia as duas threads, passando como parametroa thread e a função que cada uma deve executar pthread_create(&thread_1, NULL, tarefa_1, NULL); pthread_create(&thread_2, NULL, tarefa_2, NULL); pthread_create(&thread_3, NULL, tarefa_3, NULL); // faz com que a thread principal espere a thread 1,2,3 acabarem; pthread_join(thread_1, NULL); pthread_join(thread_2, NULL); pthread_join(thread_3, NULL); printf("resultado da tabela 3\n"); for(int i = 0;i<3; i++){ for(int j= 0; j<3;j++){ printf("%i\t ",c[i][j]); } printf("\n"); } exit(0); }
    • Por brunomf01
      Olá, bom dia...
      Estou com um probleminha que é o seguinte:
      Estou tentando salvar o conteudo de Log que fica armazenado em um Tmemo.
      #código
      Log.Lines.SaveToFile(ExtractFileDir(ParamStr(0)) + '\Erros '+FormatDateTime('dd-mm-yy',Date)+' '+FormatDateTime('hhmmss',Time)+'.sql'); blza... usando o codigo acima eu consigo salvar executando o programa normalmente sem Thread e eu consigo o Resultado que eu espero.
      Porém,
      como se trata de um conversor de base de dados, eu uso um componente pageControl para navegar entre a tela de conversao e a tela de Log é necessario rodar os processos dentro de uma Thread (o que tbm ajuda a nao dar uma impressao de sistemma travado para o usuario)...
      Ate aqui o sistema esta 99%.. mas falta esse um por cento de que na hora de eu gravar o Tmemo (Log) some da tela do sistema. O arquivo é salvo normalmente, porem some o que deveria ficar na tela... Acho q ficou um pouco confuso porque meu problema nao é exatamente pra salvar de primeira vez, pq ate funciona.. mas caso eu mandar converter novamente sem fechar o programa ele nao vai salvar nada no log pq aparentemente o sistema esta destruindo o componente Tmemo, pois nem com o comando:
      #código
      Log.Visible := True; ele nao volta a mostrar na tela....
      se alguem puder de dar uma luz nesse problema eu ficaria grato...
      eu chamo assim a Thread:
      #código
      procedure TF_inicial.SpeedButton1Click(Sender: TObject);
      var thread: ExecutaProcessos; begin thread := ExecutaProcessos.Create(false); thread.FreeOnTerminate := True; thread.Resume; end; att...
    • Por wllf
      Boa noite pessoal, desenvolvi um sistema multi thread com C# (windows form) que trabalha 24 x 7 importando dados de arquivos XMLs previamente agendados, o programa roda perfeitamente sem problemas.
       
      Esse sistema está instalado em um serviço cloud com Windows Server 2008 R2, ele roda praticamente 360 dias por ano e quando acontece do cloud "cair" (pelo menos 2 vezes por mês) então é reiniciado o Windows Server.
       
      Guardo o status da thread que está sendo executada em banco de dados, mas quando o servidor é reiniciado essa importação fica "morta" porém em aberto no banco de dados.
       
      Minha dúvida é, tem como gerar uma exception ou detectar essa reinicialização "forçada" do servidor?
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.