2010-06-07 19 views
22

Quali sono le opzioni per ottenere il parallelismo in Python? Voglio eseguire un mucchio di calcoli legati alla CPU su alcuni raster molto grandi e vorrei parallelizzarli. Venendo da uno sfondo C, ho familiarità con tre approcci al parallelismo:Parallelismo in Python

  1. Processi di passaggio di messaggi, eventualmente distribuiti in un cluster, ad es. MPI.
  2. esplicito parallelismo della memoria condivisa, sia utilizzando pthreads o fork(), tubo(), et. al
  3. Parallelismo memoria condivisa implicita, utilizzando OpenMP.

Decidere su un approccio da utilizzare è un esercizio di compromessi.

In Python, quali approcci sono disponibili e quali sono le loro caratteristiche? È disponibile un clone MPI clustering? Quali sono le modalità preferite per ottenere il parallelismo della memoria condivisa? Ho sentito parlare di problemi con lo GIL, nonché i riferimenti alle attività .

In breve, cosa è necessario sapere sulle diverse strategie di parallelizzazione in Python prima di scegliere tra esse?

risposta

13

Generalmente, si descrive un calcolo associato alla CPU. Questo non è il punto forte di Python. Né, storicamente, il multiprocessing.

Il threading nell'interprete Python mainstream è stato regolato da un temuto blocco globale. La nuova API multiprocessing risolve il problema e offre un'astrazione del pool di lavoro con pipe e code e così via.

È possibile scrivere il proprio codice critico delle prestazioni in C o Cython e utilizzare Python per la colla.

5

Il nuovo (2.6) multiprocessing modulo è la strada da percorrere. Usa i sottoprocessi, che aggirano il problema GIL. Inoltre, astrae alcuni dei problemi locali/remoti, quindi la scelta di eseguire il codice localmente o distribuirsi su un cluster può essere effettuata successivamente. La documentazione che ho collegato sopra è un bel po 'da masticare, ma dovrebbe fornire una buona base per iniziare.

0

Ci sono molti pacchetti per farlo, il più appropriato come altri detto è multiprocessing, specialmente con la classe "Pool".

Un risultato simile può essere ottenuto da parallel python, che inoltre è progettato per funzionare con i cluster.

In ogni caso, direi andare con multiprocessing.

0

A seconda della quantità di dati che è necessario elaborare e di quante CPU/macchine si intende utilizzare, in alcuni casi è meglio scrivere una parte di essa in C (o Java/C# se si desidera utilizzare jython/IronPython)

La velocità che è possibile ottenere da ciò potrebbe fare di più per le proprie prestazioni rispetto all'esecuzione parallela di 8 CPU.

Problemi correlati