[ruby-core:105086] [Ruby master Feature#18139] Add a method to stop/kill a Ractor from outside
From:
"tagomoris (Satoshi TAGOMORI)" <noreply@...>
Date:
2021-08-30 02:40:46 UTC
List:
ruby-core #105086
Issue #18139 has been updated by tagomoris (Satoshi TAGOMORI).
The alternative idea to make it stoppable is to add a method/runtime-feature to select both I/O and Ractor (like golang's `select`), but I think `Ractor#kill` (or something like that) should be able to support wide use-cases.
----------------------------------------
Feature #18139: Add a method to stop/kill a Ractor from outside
https://bugs.ruby-lang.org/issues/18139#change-93494
* Author: tagomoris (Satoshi TAGOMORI)
* Status: Open
* Priority: Normal
----------------------------------------
When a Ractor is doing I/O, it can'tf stop by itself (even when I/O is nonblock, IO.select will block).
```ruby
r = Ractor.new(listen) { |listen|
while connection = listen.accept
# process
end
}
Signal.trap(:INT) { r.kill } # I want to do this
# or r.stop, r.interrupt
# or r.raise(MyStopSignalError)
```
If a Ractor's input is Ractor.receive only, it can stop itself when it receives a stop signal (via Ractor.receive). But the Ractor is doing I/O, it can't listen Ractor.receive. So there are no any channels to tell it should stop.
Under the current situation, we can only stop the entire runtime at once without any shutdown processes.
So, I want a method to kill or interrupt the Ractor, or to raise an exception in that Ractor from the outside.
--
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>