Elaborazione multipla di debug in Python


Risposte:


6

I veri programmi Python multiprocessore (al contrario dei programmi Python multi- thread che hanno a che fare con il temuto GIL ) non sono diversi da quelli di qualsiasi altra lingua. Tutti hanno le stesse sfide di base:

  1. Assegnazione delle attività e report dei risultati. Anche se lavorano principalmente su set di dati indipendenti, di solito devono tornare al thread principale per riportare i risultati e ottenere nuovi dati su cui lavorare. Questo può essere un punto di strozzamento.
  2. Condizioni di gara. I processi stanno provando a usare una risorsa alla volta e devono usare il mutex (o qualcosa di simile) per evitare di scavalcare i dati reciproci. La mancata protezione di questo tipo di risorse può portare a sessioni di debug davvero molto dolorose.
  3. Sequenzialità. A volte stai cercando di fare qualcosa di parallelo che non lo è. I vari processi finiscono per aspettarsi l'un l'altro di fare qualcosa e il risultato finale è che tu, a tutti gli effetti, hai preso un programma sequenziale, lo hai reso parallelo e finisce ancora per eseguire in tempo lineare (o peggio).

Sebbene esistano metodi di sviluppo che cercano di evitare ciascuno di questi problemi, alla fine devi davvero pensare a quello che stai facendo. Raccomando pesanti prove di stress - molto al di là di qualsiasi cosa tu pensi possa accadere nella vita reale - in modo da avere buone probabilità di colpire quelle finestre di opportunità e far esplodere in fase di sviluppo rispetto a durante una demo importante o durante la produzione.

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

Ma lo strumento migliore è un buon design e persone davvero cattive e cattive che cercano di far saltare in aria la tua app. (Ciao, Dbell!)


25

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

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

Vedi anche: http://docs.python.org/library/multiprocessing.html#logging

Inoltre, è possibile accedere al nome del processo corrente utilizzando:

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

Vedi: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.