[Python] saluti e prima domanda sulle list comprhension
Enrico Franchi
enrico.franchi a gmail.com
Mar 29 Gen 2008 11:31:12 CET
On Jan 28, 2008, at 8:47 PM, Java wrote:
> Ma scusa, invece se lancio due processi, ognuno dei quali deve
> scrivere
> sullo stesso file non ci sono race conditions?
In linea abbastanza teorica, si. In pratica il punto è *cosa* devono
farci di sensato per scrivere tutti e due sullo stesso file.
E' un log? Beh, allora basta lasciare gestire la cosa al sistema
operativo: siamo solo in append e non importa se una delle due righe è
prima dell'altra (e il buffering dell'OS Normalmente gestisce la cosa
-- e se non lo fa, chissene).
Hai più processi che devono scrivere sullo stesso file e non ci puoi
fare nulla architetturalmente?
Bene: è il momento per usare i lock. Esatto! Oppure, se per vari
motivi la cosa è sensata/fattibile deleghi la scrittura ad un unico
processo che prende messaggi dagli altri. Questa è la soluzione dello
spooler di stampa, in buona sostanza.
Ma in generale è quello che accade per esempio su un database system.
Ci sono varie soluzioni, ovviamente.
Ma la tua obiezione è del tipo: c'è un caso complicato e noioso che in
determinate occasioni si manifesta. Per cui chi se ne impippa se lo
facciamo manifestare sempre. Io invece ti rispondo: facciamolo
manifestare il meno possibile.
Dopo di che un conto è avere un lock su un'operazione di I/O che
bloccherebbe comunque, un conto è avere un lock su una variabile in
ram che di per se potrebbe essere gestita in qualche boh, qualche
nanosecondo. Direi che sono cose *radicalmente* diverse. A fronte di
*nessun* vantaggio concreto.
> Devo comunque mettere su dei lock sul file e il processo che trova il
> file lockato (ARGH!) si siede e aspetta giocando con la psp.
E quindi? E' comunque I/O. Se non puoi evitare il problema, almeno
rendilo raro. Inoltre, come dicevo, l'overhead su un'operazione di
questo tipo è percentualmente molto più piccolo che averlo su un
accesso in memoria.
> qualcuno mi ha proposto la gestione asincrona della cosa, ma come ho
> detto "asincrono" mi puzza di "gestione di eventi e segnali" che è di
> certo più tediosa di un piccolo lock...
'Di certo' poi un accidenti. In primo luogo perchè buona parte del
meccanismo ti viene gestito dal sistema (non è che twisted se lo sono
inventato per il divertimento di fare passare una poll per 12 strati
software diversi, eh).
Anche fare le cose a mano, non è poi terribilmente noioso, se hai ben
progettato il sistema. Ribadisco poi che con Twisted è tutto *gratis*.
Nota bene che qui non sono mica solo io a dirti di tenerti lontano dai
thread, ma c'è una certa unanimità a riguardo. Non è che ci siamo
messi d'accordo. Come dicevo, potrei anche segnalarti fonti letterarie
a riguardo.
I thread sono spinti e difesi in sostanza dai javisti principalmente
perchè se no gli crolla il mondo addosso. Hanno pure tentato approcci
asincroni, ma non so se per incapacità loro, problemi di linguaggio,
macchina virtuale o cosa, sono solo riusciti a complicare il tutto. Ma
questo è un problema *loro*.
More information about the Python
mailing list