Project

General

Profile

Actions

Feature #18139

closed

Add a method to stop/kill a Ractor from outside

Added by tagomoris (Satoshi TAGOMORI) 9 months ago. Updated 6 months ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:105085]

Description

When a Ractor is doing I/O, it can'tf stop by itself (even when I/O is nonblock, IO.select will block).

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.

Updated by tagomoris (Satoshi TAGOMORI) 9 months ago

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.

Updated by ko1 (Koichi Sasada) 6 months ago

  • Status changed from Open to Rejected

Now Ractor is designed to "unexpected interruption free" (at least cross-ractor interruptions) so now it is not acceptable. Let's try without interrupts.

Actions

Also available in: Atom PDF