Sto cercando un metodo in Ruby, che è fondamentalmente questo:Esiste un metodo semplice per verificare se un'istanza di Ruby IO bloccherà su read()?
io.ready_for_read?
Voglio solo controllare se un determinato oggetto IO
(nel mio caso, il risultato di una chiamata popen
) è dotato di un'uscita a disposizione, vale a dire una chiamata di follow-up io.read(1)
non bloccherà.
Queste sono le due opzioni che vedo, nessuno dei quali mi piace:
io.read_nonblock
- troppo sottile un'astrazione di Unixread()
- Non voglio a che fare conerrno
gestione degli errori.io.select
con timeout 0 - offusca lo scopo di questa semplice operazione.
C'è un'alternativa migliore che ho trascurato?
Non lo so/penso/così. Questo è davvero ciò che la scelta è per. Sì, selezionare ha una sintassi orribile, ma immagino che in teoria potresti monkeypatch un "ready_for_read?" digitare il metodo in IO che utilizza select. –
L'implementazione 'IO # ready_for_read?' Non funziona per me, restituisce sempre true. Penso che il problema sia che i blocchi 'IO # select' fino a quando il flusso non viene aperto per la scrittura da un altro processo (che nel mio caso lo è sempre), non finché non ci sono dati reali da leggere.Sto cercando di rintracciare un altro modo per raggiungere questo obiettivo, ma non ho molta fortuna. –