Introdução
A programação simultânea permite que você execute várias operações ao mesmo tempo, aumentando a eficiência das suas aplicações Python, especialmente para tarefas vinculadas à CPU ou à E/S. Em Python, duas abordagens populares para concorrência são o módulo de alto nível concurrent.futures
e o módulo de baixo nível Multiprocessamento
. Neste artigo, fornecemos uma comparação prática desses dois métodos, demonstramos seu uso com exemplos e oferecemos algumas informações sobre benchmark para ajudá-lo a escolher a melhor opção para suas necessidades.
Visão geral: concurrent.futures
vs. Multiprocessamento
concurrent.futures
O módulo concurrent.futures
fornece uma interface de alto nível para executar chamadas de forma assíncrona usando threads ou processos. Seus principais componentes são:
- ThreadPoolExecutor
: Para tarefas limitadas pela E/S.
- ProcessPoolExecutor
: Para tarefas limitadas pela CPU.
Este módulo simplifica o processo de gerenciamento de concorrência com uma API consistente.
Multiprocessamento
O módulo Multiprocessamento
permite criar vários processos, cada um com seu próprio interpretador Python e espaço de memória. É ideal para tarefas vinculadas à CPU e oferece um controle mais preciso sobre a criação e a comunicação de processos, embora exija mais código padrão do que concurrent.futures
.
Exemplos práticos
Abaixo estão exemplos lado a lado que ilustram como usar os dois módulos para realizar um cálculo simples: calcular o quadrado dos números em uma lista.
import concurrent.futures
import time
def square(n):
0.5) # Simule uma operação vinculada à CPU
time.sleep(return n * n
if __name__ == "__main__":
= [1, 2, 3, 4, 5]
numbers with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
= list(executor.map(square, numbers))
results print("Results with concurrent.futures:", results)
import Multiprocessamento
import time
def square(n):
0.5) # Simule uma operação vinculada à CPU
time.sleep(return n * n
if __name__ == "__main__":
= [1, 2, 3, 4, 5]
numbers with Multiprocessamento.Pool(processes=3) as pool:
= pool.map(square, numbers)
results print("Results with Multiprocessamento:", results)
Insights do benchmark
Observação: Os resultados do benchmark podem variar dependendo da configuração do sistema e da carga de trabalho. Geralmente, para tarefas vinculadas à CPU, tanto ProcessPoolExecutor
quanto Multiprocessamento.Pool
têm desempenho semelhante. No entanto, concurrent.futures
oferece uma API mais amigável e melhor tratamento de erros, enquanto Multiprocessamento
fornece um controle mais refinado.
Quando usar cada abordagem
- Use
concurrent.futures
se:- Você prefere uma API mais simples e de nível superior.
- Você está lidando com tarefas vinculadas a E/S com
ThreadPoolExecutor
ou tarefas vinculadas à CPU comProcessPoolExecutor
. - Você deseja suporte integrado para futuros, o que facilita o tratamento de erros e o cancelamento.
- Use
Multiprocessamento
se:- Você precisa de mais controle sobre o gerenciamento de processos e a comunicação entre processos.
- Sua aplicação é altamente dependente da CPU e você precisa otimizar o uso de recursos.
- Você se sente confortável com mais código padrão para gerenciamento de processos.
Conclusão
Tanto concurrent.futures
quanto Multiprocessamento
oferecem soluções robustas para programação simultânea em Python. Sua escolha depende dos requisitos específicos de suas tarefas e de sua preferência por simplicidade ou controle. Experimente as duas abordagens para determinar qual se adapta melhor à sua carga de trabalho e considere o uso de ferramentas de benchmarking para medir o desempenho em seu ambiente específico.
Leitura adicional
- Processamento paralelo em Python: acelere seu código
- Otimizando código de multiprocessamento em Python
- Introdução à programação assíncrona com Asyncio do Python
Boa programação e que seus programas simultâneos sejam executados com eficiência!
Explore mais artigos
Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.
Reuso
Citação
@online{kassambara2024,
author = {Kassambara, Alboukadel},
title = {Programação simultânea: concurrent.futures vs.
Multiprocessamento},
date = {2024-02-05},
url = {https://www.datanovia.com/pt/learn/programming/python/advanced/parallel-processing/concurrent-programming.html},
langid = {pt}
}