[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