Por vezes considerado um recurso obscuro pelos desenvolvedores Delphi, esta apresentação visa mostrar situações cotidianas que podem ser otimizadas pela aplicação de threads no Delphi, as armadilhas e erros comuns na adoção do paralelismo, e as soluções para contornar estas situações .Podemos tornar nossos aplicativos mais fluídos bem como tornar o processamento de tarefas mais rápidos. Nesta palestra veremos algumas boas práticas acerca do assunto partindo da classe TThread chegando à recente PPL (Parallel Programming Library). É um recurso importante no desenvolvimento Win32, Mobile e backend nos ajudando a tornar as aplicações assíncronas e, portanto, escaláveis.
2. Globalcode – Open4education
Agenda
Mario Guedes – mario@arrayof.io
https://arrayof.io
Motivações para dominar paralelismo
Carlos Agnes - tatu@taturs.com
http://taturs.com
Exemplos práticos para o dia à dia
3. Globalcode – Open4education
O que é paralelismo?
Capacidade de executar mais de uma tarefa ao
mesmo tempo, ou seja, lado a lado, ou seja, de
forma paralela.
Ao mesmo tempo numas: Depende da quantidade
de CPU presente no dispositivo e da concorrência
com os outros processo e threads.
4. Globalcode – Open4education
Mas o que é thread?
Thread, ou segmento, é a unidade básica de execução em
um sistema operacional.
Um software tem, no mínimo, uma thread: A thread
principal.
Para executarmos mais de uma tarefa a um só tempo
temos que criar nossas próprias threads.
7. Globalcode – Open4education
Motivações
Melhorar a experiência do usuário
Não travar a tela enquanto processa algo “pesado”
Velocidade de execução de uma tarefa
Chamadas REST, que por envolver latência de
rede, costuma demorar um pouco mais
Escalabilidade
Monitoração de eventos
8. Globalcode – Open4education
Pense de forma assíncrona
A, B, C, D, E ...
A, D, X, M, N, F, J, O, B ...
Blocante X Não Blocante
Comece a pensar em tarefas, tarefas paralelas.
9. Globalcode – Open4education
No Delphi
Temos a clássica System.Classes.TThread
Abstrai a API do S.O.
Criamos classes descendentes e implementamos o método
Execute
Temos também a Thread anônima
Desde o Delphi XE7 temos a biblioteca PPL em System.Threading
Biblioteca de Programação Paralela
Cuida do balanceamento da execução das threads
Torna mais fácil a adoção de paralelismo
TParallel.For – TTask - IFuture
10. Globalcode – Open4education
E o TTimer?
Não é uma Thread!
É um mecanismo onde o S.O.
envia uma mensagem ao nosso
processo que reage executando
um código pela Thread
principal.
11. Globalcode – Open4education
TParallel.For
Forma marota de delegar uma tarefa “repetitiva” à várias threads
e aguardar o encerramento dela.
Recebe três parâmetros:
Valor inicial
Valor máximo
Método anônimo que receberá o valor
Esse método anônimo será executado em um contexto
thread
Possui diversas outras assinaturas!
12. Globalcode – Open4education
TTask - ITask
TTask.Create recebe um método anônimo que
será executado em um contexto de thread.
Daí damos .Start e vida que segue.
Preferencialmente podemos invocar o método de
classe .Run que recebe um método anônimo
A instância de TTask “morrerá” sozinha quando a
thread for finalizada – não se preocupe.
13. Globalcode – Open4education
TTask - IFuture
A classe TTask possui o método de classe .Future:
O objetivo é delegar uma função que será executado em
um contexto de thread
E recuperar o resultado desta função no... futuro!
Por isso que .Future é um método com parâmetro
genérico onde definimos o tipo da reposta
E a resposta recuperamos com .Value
14. Globalcode – Open4education
Cuidado com a GUI
TThread.Synchronize deve ser invocada nos trechos que lidam
com os componentes de interface – pois eles não são à prova de
thread
Temos também TThread.Queue, que agenda a execução da tarefa
O código em questão é executado de forma sincronizada com a
thread principal
Recebem dois parâmetros:
Referência à uma thread, em geral a corrente
Método anônimo que será executado
16. Globalcode – Open4education
Quando não aplicar
Disparar centenas de threads eventualmente
parece uma boa ideia porque o nosso código fica
linear
Porém se elas disputam um mesmo recurso crítico
vai demandar muito recurso e não irá resolver
problemas de performance – podendo até piorar
17. Globalcode – Open4education
Obrigado!
Exemplos da palestra: https://bit.ly/2JYbZel
Apostila sobre TThread: http://bit.ly/arrayof_thread
Vídeo sobre PPL: https://bit.ly/2O6f2GS
Threads no meu ERP: https://bit.ly/2GxzHgX
PPL: https://bit.ly/2YWgwo1
Concorrência em Thread: https://bit.ly/2GjUftc
Vídeo interessante: https://bit.ly/2XSidGK