Diciamo che abbiamo un generatore indefinito, in cui i nuovi elementi possono arrivare in qualsiasi momento con un ritardo significativo (fino a un indefinito).
Un esempio di tale generatore è il comando tail -F
. In python (omettendo vari casi limite) potrebbe essere implementato come segue:
def tail_follow(file):
while True:
line = file.readline()
if line:
yield line
else:
sleep(1.0)
Il problema ovvio con questo generatore è che può causare il sonno del thread del chiamante per sempre. Pertanto dovrebbe fornire al lato del chiamante un modo per interrompere l'iterazione.
La soluzione che ho trovato è la seguente:
def tail_follow(file, on_delay_callback):
while True:
line = file.readline()
if line:
yield line
else:
if on_delay_callback():
break
else:
sleep(1.0)
Questo è l'unico modo per ottenere questo comportamento con Python? So che esiste una funzione di invio che consente il trasferimento di dati a 2 vie, può essere utilizzata per rendere la soluzione più pitonica?