Thread
Definição
Thread é a menor unidade de execução dentro de um processo.
Enquanto processos são independentes entre si, threads compartilham o mesmo espaço de memória do processo ao qual pertencem — o que permite comunicação rápida, mas também exige cuidado com sincronização.
Um processo pode conter múltiplas threads executando diferentes partes de seu código simultaneamente, o que permite maior eficiência em tarefas concorrentes ou paralelas.
Objetivos do uso de Threads
- Realizar múltiplas tarefas dentro de um mesmo processo, aproveitando o compartilhamento de memória.
- Aumentar a responsividade de aplicações, mantendo a interface ativa enquanto outras tarefas são executadas.
- Aproveitar múltiplos núcleos de CPU (quando combinado com paralelismo real).
- Melhorar o desempenho de tarefas que não dependem entre si, como downloads simultâneos ou cálculos em paralelo.
Exemplo prático
import threading
import time
def tarefa(nome, tempo):
for i in range(3):
print(f'{nome} - passo {i}')
time.sleep(tempo)
# Criando duas threads
t1 = threading.Thread(target=tarefa, args=("Thread A", 1))
t2 = threading.Thread(target=tarefa, args=("Thread B", 0.5))
# Inicia as duas threads simultaneamente
t1.start()
t2.start()
# Aguarda as duas threads terminarem antes de continuar
t1.join()
t2.join()
Saída esperada
Thread A - passo 0
Thread B - passo 0
Thread B - passo 1
Thread A - passo 1
Thread B - passo 2
Thread A - passo 2
Note que as duas threads rodam concorrentemente, intercalando seus passos, mesmo dentro de um único processo.
O ciclo de execução com Threads
[Processo]
├── Thread A --> executa tarefa 1
└── Thread B --> executa tarefa 2 (em paralelo ou intercalado)
As threads compartilham memória e variáveis globais.
O sistema operacional gerencia o agendamento das threads (concorrência preemptiva).
Problemas como condições de corrida (race conditions) podem ocorrer sem sincronização adequada.
⚠️ Ao usar threads, é necessário atenção ao acesso simultâneo a variáveis compartilhadas. Mecanismos como locks ou semaphores podem ser usados para evitar inconsistências.
Nota: Em Python, por causa do GIL (Global Interpreter Lock), múltiplas threads não executam código Python puro ao mesmo tempo em múltiplos núcleos. No entanto, tarefas de I/O (como leitura de arquivos ou requisições de rede) ainda se beneficiam bastante de múltiplas threads.