[Python] Abuso di generatori?
Pietro Battiston
me a pietrobattiston.it
Sab 9 Apr 2011 23:49:29 CEST
Salve a tutti,
ho del codice che fa alcuni write su una porta seriale. Tra l'uno e
l'altro, voglio far passare un poco di tempo. Ma non voglio usare
time.sleep o analoghi per non bloccare l'interfaccia (e preferisco
evitare di usare thread).
Una soluzione l'ho trovata (uso le glib, ma il principio mi sembra
chiaro):
class ScrittoreDiSerial(object):
def __init__(self):
schiavo = self.lavoratore()
# Effettua la seguente chiamata ogni 20 millisecondi:
glib.timeout_add( 20, schiavo.next )
def lavoratore(self):
fai_qualcosa()
yield True
fai_qualcos_altro()
yield True
# E posso fare anche:
while una_condizione():
ripeti_un_azione()
yield True
# Infine:
yield
L'unica cosa scocciante è appena mi si complica un attimo "lavoratore":
non posso separare il suo codice in diversi metodi che siano ognuno
capace di fare "pause": se uno chiama yield, allora devo istanziarlo,
chiamarlo in un loop... è un po' una palla.
Per dirne una, in "lavoratore" ho cose tipo
# Aspetta al massimo un secondo:
for i in range(50):
if leggoqualcosadallaseriale():
break
yield
if nonholettoancoranulladallaseriale():
spara_messaggio_di_errore()
E idealmente tutto ciò sarebbe contenuto in una funzione in modo che da
"lavoratore" io potessi fare semplicemente
self.aspetta(num_secondi)
mentre ovviamente non funziona, perché "yield" non si propaga.
Avete idee più brillanti su come organizzare il mio codice?
Fare dei generatori che si chiamano l'un l'altro è una soluzione che non
mi piace...
Nel mio caso particolare, una soluzione forse più comoda è utilizzare,
per le pause, un (opportuno metodo, con dentro un) loop che chiama
gtk.mainiteration() finché non è passato il tempo desiderato. Ma dovrei
studiarmi ogni quanto chiamare gtk.mainiteration()... insomma, anche
questa è un po' noiosa.
grazie
Pietro
Maggiori informazioni sulla lista
Python