Debug multiprocessing in Python

10

Quali sono alcune buone pratiche nel debug di programmi di multiprocessing in Python?

    
posta vonPetrushev 25.12.2011 - 01:52
fonte

2 risposte

4

Programmi di multiprocessing Python veri e propri (al contrario di programmi multi- threaded Python che hanno a che fare con il temuto GIL ) non sono diversi da quelli in qualsiasi altra lingua. Hanno tutti le stesse sfide di base:

  1. Assegnazione delle attività e report dei risultati. Anche se lavorano principalmente su set di dati indipendenti, normalmente devono tornare al thread principale per riportare i risultati e ottenere nuovi dati su cui lavorare. Questo può essere un punto di strozzatura.
  2. Condizioni di gara. I processi stanno cercando di utilizzare una risorsa una tantum e hanno bisogno di usare mutex (o qualcosa di simile) per evitare di scavalcare l'uno sull'altro i dati. La mancata protezione di questo tipo di risorse può portare a sessioni di debug dolorose davvero davvero dolorose.
  3. La sequenzialità. A volte stai cercando di creare qualcosa di parallelo che non sia. I vari processi finiscono per aspettare l'un l'altro per fare qualcosa e il risultato finale è che avete, per tutti gli effetti, preso un programma sequenziale, reso parallelo, e che comunque finisce per essere eseguito in tempo lineare (o peggio).

Sebbene esistano metodi di sviluppo che cercano di evitare ciascuno di questi problemi, alla fine della giornata devi davvero pensare a quello che stai facendo. Raccomando pesanti test di stress - molto più di qualsiasi cosa tu pensi che possa accadere nella vita reale - in modo da avere una buona possibilità di colpire quelle Windows of Opportunity e far esplodere lo sviluppo piuttosto che nel bel mezzo di un demo principale o durante la produzione.

Usavamo file di log con microsecondi e quindi creavamo un'app di visualizzazione dei log con codice colore in modo da provare per visualizzare cosa stava accadendo tra processo N in esecuzione su processori M. Abbiamo anche provato (e soprattutto ci siamo riusciti) a creare un sistema in grado di scacciare i file di log per ricreare il contesto del crash.

Ma lo strumento migliore è un buon design e persone davvero cattive e cattive che cercano di far saltare la tua app fuori dall'acqua. (Ciao, dbell!)

    
risposta data 25.12.2011 - 03:00
fonte
21

Una cosa che trovo molto utile è usare il logger esistente nel modulo multiprocessing . Prova questo nel tuo codice principale:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

Vedi anche: link

Inoltre, puoi accedere al nome del processo corrente usando:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

Vedi: link

A parte questo, non conosco nient'altro che i metodi standard di debug come pdb & co.

    
risposta data 22.10.2012 - 13:01
fonte

Leggi altre domande sui tag