Programação simultânea: concurrent.futures vs. Multiprocessamento

Uma comparação prática para concorrência eficiente em Python

Compare o módulo concurrent.futures de alto nível do Python com o módulo Multiprocessamento de nível inferior. Aprenda as diferenças, veja exemplos práticos e analise insights de benchmark para escolher o modelo de concorrência certo para suas tarefas.

Programação
Autor
Afiliação
Data de Publicação

5 de fevereiro de 2024

Data de Modificação

29 de abril de 2025

Palavras-chave

Python concurrent.futures, multiprocessamento em Python, Programação simultânea em Python, Comparação de concorrência em Python, Limitado pela CPU vs. limitado pela E/S

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):
    time.sleep(0.5)  # Simule uma operação vinculada à CPU
    return n * n

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
        results = list(executor.map(square, numbers))
    print("Results with concurrent.futures:", results)
import Multiprocessamento
import time

def square(n):
    time.sleep(0.5)  # Simule uma operação vinculada à CPU
    return n * n

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    with Multiprocessamento.Pool(processes=3) as pool:
        results = pool.map(square, numbers)
    print("Results with Multiprocessamento:", results)

Insights do benchmark

Nota

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 com ProcessPoolExecutor.
    • 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

Boa programação e que seus programas simultâneos sejam executados com eficiência!

Explore mais artigos

Nota

Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.

placeholder

placeholder
Nenhum item correspondente
De volta ao topo

Reuso

Citação

BibTeX
@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}
}
Por favor, cite este trabalho como:
Kassambara, Alboukadel. 2024. “Programação simultânea: concurrent.futures vs. Multiprocessamento.” February 5, 2024. https://www.datanovia.com/pt/learn/programming/python/advanced/parallel-processing/concurrent-programming.html.