[Python] Gestire eventi con callback

Alessandro Re ale a ale-re.net
Dom 8 Mar 2015 15:11:25 CET


Ciao Marco,

intanto grazie per la risposta :)

2015-03-08 7:54 GMT+00:00 Marco Giusti <marco.giusti a posteo.de>:
> Come registri le callback? Gli oggetti in python sono referenziati da
> del codice python o solo dalle callback di c++? In questo caso basta
> che, nel momento in cui distruggi l'oggetto C, deregistri le callback
> e riduci il numero di referenze del metodo. Se i metodi di un oggetto
> P sono usati come callback di un solo oggetto C, al momento che
> tu rilasci tutte le callback non esistono più riferimenti all'oggetto
> python.

Il problema è proprio la registrazione delle callback... Per ora ho un
meccanismo piuttosto primitivo:
quando un evento accade, viene chiamato un metodo on_evento(*args) di python.
L'idea è che l'oggetto tiene una lista di callback da
chiamare per quell'evento, e quel metodo è definito più o meno come

def on_evento(self, *args):
  for callback in self._callbacks:
    callback(*args)

Però è per l'appunto primitivo, e non viene assolutamente gestita la
rimozione delle callback. Prima di avventurarmi ed inventare qualcosa
che cerchi di automatizzare la rimozione, volevo capire se c'era già
qualche pattern usato in questi casi.

>> Come posso rendere sincrona (bloccante) l'invocazione di un comando?
>
> La prima idea che mi viene in mente è di infilare la callback dentro la
> send e di chiamare sleep per salvare qualche ciclo macchina:
>
>     def send_data_blocking(data):
>         def go():
>             free_to_go = True
>         free_to_go = False
>         send_data(data, callback=go)
>         while not free_to_go:
>              sleep(0.1)

Grazie, proverò con la sleep :) (btw, in go() non ci andrebbe un
"nonlocal free_to_go"?)

Ciauz
~Ale


Maggiori informazioni sulla lista Python