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.

chegamos ao grande problema nisso tudo. O que é que junta todas essas peças?

Temos um belo conjunto de classes com abstrações e classes razoavelmente

bem-feitas, mas que só são úteis quando os objetos são instanciados. Quem é o

responsável por construir os objetos e orquestrar o MapReduce?

A maneira mais simples é construir manualmente o programa principal e

conectar os objetos usando um punhado de funções auxiliares. No exemplo a

seguir, listamos o conteúdo de uma pasta e instanciamos PathInputData para

cada arquivo que ela contém:

def generate_inputs(data_dir):

for name in os.listdir(data_dir):

yield PathInputData(os.path.join(data_dir, name))

Depois, criamos as instâncias de LineCountWorker usando as instâncias de

InputData devolvidas por generate_inputs.

def create_workers(input_list):

workers = []

for input_data in input_list:

workers.append(LineCountWorker(input_data))

return workers

Executamos essas instâncias de Worker abrindo em leque o passo map em

múltiplas threads (consulte o Item 37: “Use threads para bloquear I/O e evitar

paralelismo”). Depois, chamamos reduce repetidamente para combinar os

resultados em um único valor final.

def execute(workers):

threads = [Thread(target=w.map) for w in workers]

for thread in threads: thread.start()

for thread in threads: thread.join()

first, rest = workers[0], workers[1:]

for worker in rest:

first.reduce(worker)

return first.result

Finalmente, conecto todas as peças juntas em uma função que executa cada um

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!