Lettura non bloccante


#1

Eccomi di nuovo qui con un altra incredibile domanda:
ogni metodo di lettura che ho provato per leggere da un socket tcp
risulta bloccante ma io devo aspettare in lettura solo X secondi
trascorsi i quali se non ho ancora letto niente devo mandare un
controllo di connessione attiva.

Qualcuno sa aiutarmi ?


#2

— Federico G. removed_email_address@domain.invalid ha
scritto:

Qualcuno sa aiutarmi ?
require ‘timeout’
:slight_smile:
Alternativamente avvia un altro thread, i Thread non
vengono bloccati in quanto ruby sotto sotto usa
select() sugli stream.


icq: #69488917
blog: http://riffraff.blogsome.com


Yahoo! Messenger with Voice: chiama da PC a telefono a tariffe esclusive
http://it.messenger.yahoo.com


#3

Molto bello il timeout, peccato che non l’abbia conosciuto prima …
Piccola domandina quasi trascurabile, speravo di rimandare l’argomento
(sono ancora molto newbe) ma se il tempo che imposto trascorre prima
che l’operazione venga conclusa ottengo un non molto bello execution
expired (Timeout::Error) :frowning:
come posso evitarlo (e anzi fargli fare qualche altra cosa) ?

Da quello che ho visto penso di dover usare rescue, confermate ?


#4

— Federico G. removed_email_address@domain.invalid ha
scritto:

Da quello che ho visto penso di dover usare rescue,
confermate ?

esatto, quando viene sollevata uin’eccezione tu la
acchaippi con rescue e vedi se puoi fare
qualcos’altro. Ovviamente magari ci sono eccezioni che
non vuoi recuperare, quindi fai attenzione ad usare un
argiomento per la clausola rescue:

rescue Timeoutcomesichiama


icq: #69488917
blog: http://riffraff.blogsome.com


Yahoo! Mail: gratis 1GB per i messaggi e allegati da 10MB
http://mail.yahoo.it


#5

Molto bello il timeout, peccato che non l’abbia conosciuto prima …
Piccola domandina quasi trascurabile, speravo di rimandare l’argomento
(sono ancora molto newbe) ma se il tempo che imposto trascorre prima
che l’operazione venga conclusa ottengo un non molto bello execution
expired (Timeout::Error) :frowning:
come posso evitarlo (e anzi fargli fare qualche altra cosa) ?

Da quello che ho visto penso di dover usare rescue, confermate ?

Prova con qualcosa come:

begin
Timeout::timeout(5) { data = sock.read(…) }
use(data)
rescue Timeout::Error
retry if connection_alive?
end

(“use” e “connection_alive?” sono pseudocodice…)