2011-10-19 11 views
10

Ho una pipeline che a un certo punto suddivide il lavoro in vari sottoprocessi che fanno la stessa cosa in parallelo. Quindi il loro output dovrebbe andare nello stesso file.Cosa succede se due script Python vogliono scrivere nello stesso file?

È troppo rischioso dire che tutti questi processi dovrebbero scrivere nello stesso file? Oppure Python prova a riprovare se vede che questa risorsa è occupata?

risposta

7

In generale, questa non è una buona idea e richiederà molta attenzione per ottenere il risultato corretto. Poiché le scritture dovranno essere serializzate, potrebbe anche influire negativamente sulla scalabilità.

Si consiglia di scrivere per separare i file e unirli (o semplicemente lasciandoli come file separati).

+0

Oh ok! Come può influire sulla scalabilità? Vuoi dire se improvvisamente molti processi vogliono scrivere nello stesso file e trattenerti l'un l'altro? – dmeu

+0

@dmeu: Questo è fondamentalmente. Se hai più processi che vogliono scrivere allo stesso tempo, solo uno di loro sarà in grado di farlo, e il resto starà lì seduto in attesa invece di fare un lavoro utile. – NPE

8

Questo dipende dal sistema. In Windows, la risorsa è bloccata e ottieni un'eccezione. In Linux è possibile scrivere il file con due processi (i dati scritti potrebbero essere mescolati)

Idealmente in questi casi si dovrebbe usare semafori per sincronizzare l'accesso alle risorse condivise.

Se si utilizza semafori è troppo pesante per le vostre esigenze, allora l'unica alternativa è quella di scrivere in file separati ...

Edit: Come sottolineato da occhio a later post, un gestore di risorse è un'altra alternativa per gestire scrittori concorrenti

3

Una soluzione migliore consiste nell'implementare un gestore risorse (writer) per evitare di aprire due volte lo stesso file. Questo gestore potrebbe utilizzare meccanismi di sincronizzazione dei thread (threading.Lock) per evitare l'accesso simultaneo su alcune piattaforme.

+0

Ok dovrò esaminare questa opzione. Funzionerà anche su un cluster, giusto? significato su un sistema in cui i calcoli sono fatti su computer diversi, ma condividono il filesystem in cui scrivono i loro risultati – dmeu

+0

Diversi processi non possono condividere un threading.Lock. – marcv81

1

Che ne dici se tutti i diversi processi scrivono il loro output in una coda e hanno un singolo processo che legge quella coda e scrive nel file?

Problemi correlati