Project

General

Profile

Actions

Feature #17414

open

Ractor should allow access to shareable attributes for Modules/Classes

Added by marcandre (Marc-Andre Lafortune) almost 4 years ago. Updated 8 months ago.

Status:
Assigned
Target version:
-
[ruby-core:101566]

Description

Current situation is very limiting.

Use-case: global config.

Example: yaml has a global config and it's not clear to me how to make that Ractor-aware (nicely).

It is possible to have the same effect but in ugly ways:

# Using instance variables of Module not allowed:

module Config
  class << self
    attr_accessor :conf
  end
  self.conf = 42
end

Ractor.new { Config.conf = 66 }.take # => can not access instance variables from non-main Ractors
Ractor.new { puts Config.conf }.take # => can not access instance variables from non-main Ractors

# Same functionality using constants allowed:
module Config
  class << self
    def conf
      CONF
    end

    def conf=(new_conf)
      remove_const(:CONF)
      const_set(:CONF, new_conf)
    end
  end
  CONF = 42
end

Ractor.new { Config.conf = 66 }.take # => ok
Ractor.new { puts Config.conf }.take # => 66

# Same functionality using methods allowed:
module Config
  class << self
    def conf
      42
    end

    def conf=(new_conf)
      singleton_class.undef_method(:conf)
      define_singleton_method(:conf, &Ractor.make_shareable(Proc.new { new_conf }))
    end
  end
end

Ractor.new { Config.conf = 66 }.take # => ok
Ractor.new { puts Config.conf }.take # => 66

The priority would be to allow reading these instance variables if they are shareable. Ideally writing would also be allowed, but limiting that to main ractor is less probablematic than with reading.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0