15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

possível? O código a seguir mostra o que a classe ProcessPoolExecutor

realmente faz (fazendo uso das estruturas de linguagem de baixo nível

disponibilizados pelo módulo multiprocessing):

1. Toma cada item de numbers, na entrada, e o entrega a map.

2. Os dados são serializados em binário usando o módulo pickle (consulte o

Item 44: “Aumente a confiabilidade de pickle com copyreg”).

3. Os dados serializados são copiados do processo principal do interpretador

para um processo-filho por um socket local.

4. Depois, os dados são desserializados para seu formato original, objetos do

Python, usando pickle no processo-filho.

5. O módulo de Python contendo a função gcd é importado.

6. A função é executada nos dados de entrada em paralelo com outros

processos-filho.

7. O resultado é novamente serializado em bytes.

8. Os bytes são copiados através do socket para o processo principal do

interpretador.

9. Os bytes são desserializados e convertidos em objetos do Python no

processo-pai.

10. Por fim, os resultados devolvidos pelos diversos processos-filho são unidos

em uma única lista para ser devolvida com return.

Embora pareça simples ao programador, o módulo multiprocessing e a classe

ProcessPoolExecutor executam uma quantidade monstruosa de trabalho para que

o paralelismo possa ser possível. Em muitas linguagens, o único ponto de

contato necessário para coordenar duas threads é uma única trava ou operação

atômica. O tempo de CPU adicional necessário para usar multiprocessing é alto

por conta de todas as serializações e desserializações que precisam ocorrer para

que o processo-pai possa conversar com os processos-filho.

Esse esquema é bastante apropriado para certos tipos de tarefas isoladas e de alta

alavancagem. Por isoladas, entendemos funções que não precisam compartilhar

seus estados com outras partes do programa. Por alta alavancagem entendemos

situações nas quais apenas uma pequena porção dos dados precisa ser transferida

entre os processos pai e filho, mas mesmo assim a computação efetuada é

bastante intensa. O algoritmo de máximo denominador comum é um exemplo

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!