From: "ioquatix (Samuel Williams)" Date: 2022-07-20T11:48:57+00:00 Subject: [ruby-core:109262] [Ruby master Feature#18630] Introduce general `IO#timeout` and `IO#timeout=` for blocking operations. Issue #18630 has been updated by ioquatix (Samuel Williams). Okay, I was able to make it work: ```ruby STDIN.timeout = 1 pp STDIN.read ``` Output: ``` /Users/samuel/Projects/ioquatix/ruby/build/../test.rb:3:in `read': Operation timed out @ io_fread - (Errno::ETIMEDOUT) from /Users/samuel/Projects/ioquatix/ruby/build/../test.rb:4:in `
' ``` The final step is to decide what kind of exception we should use. ---------------------------------------- Feature #18630: Introduce general `IO#timeout` and `IO#timeout=` for blocking operations. https://bugs.ruby-lang.org/issues/18630#change-98392 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal ---------------------------------------- I would like us to consider introducing a general IO timeout for all (non-)blocking operations, specified per-IO instance. It's useful for ensuring programs don't stop responding or spend an unreasonable amount of time waiting for IO operations. There are effectively two kinds of interfaces that we need to address: - Those that already have a timeout argument (e.g. `wait_readable`) and we follow the existing semantics. - Those that don't have a timeout argument or timeout semantics (e.g. `puts`, `gets`), and thus probably need to raise an exception on timeout. We have three possible kinds of exceptions we could raise: - `Errno::ETIMEDOUT` - `Timeout::Error` (from `timeout.rb`) - Introduce `IO::Timeout` or something similar. Timeout isn't necessarily an error condition. There are different arguments for whether we should define: ```ruby class IO::Timeout < Exception end # or class IO::Timeout < StandardError end ``` I believe the latter (`StandardError`) is more practical but I'm open to either option. I might have more specific arguments later why one is better than the other after testing in a practical system. There is already a PR to try it out: https://github.com/ruby/ruby/pull/5653 -- https://bugs.ruby-lang.org/ Unsubscribe: