[ruby-core:109786] [Ruby master Feature#18982] Add an `exception: false` argument for Queue#push, Queue#pop, SizedQueue#push and SizedQueue#pop
From:
"shyouhei (Shyouhei Urabe)" <noreply@...>
Date:
2022-08-30 08:36:50 UTC
List:
ruby-core #109786
Issue #18982 has been updated by shyouhei (Shyouhei Urabe).
I don't think people want to exit from a `while item = queue.pop` loop because the queue would block. `for (;;) { if (errno != EAGAIN) break; ... }` is a C idiom (people often break from a loop on error, _except_ EAGAIN).
----------------------------------------
Feature #18982: Add an `exception: false` argument for Queue#push, Queue#pop, SizedQueue#push and SizedQueue#pop
https://bugs.ruby-lang.org/issues/18982#change-99022
* Author: byroot (Jean Boussier)
* Status: Open
* Priority: Normal
----------------------------------------
This replaces [Feature #18965]
Currently these methods raise in three occasions:
- `ThreadError(queue empty)` for `#pop` in `nonblock=true` mode, and the operation would block.
- `ThreadError(queue full)` for `SizedQueue#push` in `nonblock=true` mode, and the operation would block.
- `ClosedQueueError` if trying to `#push` in a closed queue.
I see several reasons to prefer a `nil` return value.
- Queue is often used in conjunction with threads, so you have to be very careful not to rescue an unrelated `ThreadError`.
- Queue if often used for low level code, deep in the stack, so exceptions are costly.
I propose that passing `exception: false` would cause the method to return `nil` instead of raising in the three cases listed above.
The argument `exception: true` is consistent with various other methods such as `IO#read_nonblock(exception: false)`.
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>