Project

General

Profile

Actions

Feature #20805

closed

Allow Ractor#send from a signal trap Proc

Added by kirs (Kir Shatrov) about 1 month ago. Updated 24 days ago.

Status:
Feedback
Assignee:
-
Target version:
-
[ruby-core:119559]

Description

It was surfaced in https://bugs.ruby-lang.org/issues/18139 that Ractor is designed to "unexpected interruption free" and it's not supposed to have a kill-like method.

A better alternative to that would be allow the main Ractor to consume a shutdown signal from the pipe.

Example:

shutdown_ractor = Ractor.new do
  Ractor.recv # Wait for a signal
end

# Signal trap for SIGTERM
Signal.trap("TERM") do
  puts "Received SIGTERM, shutting down..."
  shutdown_ractor.send(:shutdown) # Send the shutdown signal
end

pipe = Ractor.new do
  loop do
    r, value = Ractor.select(Ractor.recv, shutdown_ractor)

    if r == shutdown_ractor # Shutdown signal received
      break
    else
      Ractor.yield(value, move: true) # Normal operation
    end
  end
end

However, it's not possible to do Ractor#send from a trap Proc right now:

<internal:ractor>:282:in `new': can not isolate a Proc because it accesses outer variables (shutdown_ractor). (ArgumentError)

From what I've gathered, it makes it impossible to implement any graceful shutdown in a process with a few Ractors running.

Actions

Also available in: Atom PDF

Like0
Like0Like0