From: ko1@... Date: 2020-11-12T17:07:25+00:00 Subject: [ruby-core:100817] [Ruby master Feature#17323] Ractor::LVar to provide ractor-local storage Issue #17323 has been updated by ko1 (Koichi Sasada). Another advantages compare with current API is, * we don't need to care about variable name. * we can make ractor-local constants and instance variables like that: ```ruby class Fib attr_reader :cache def initialize @cache = Ractor::LVar.new{ {} } end private def _fib n if n < 2 1 else fib(n-1) + fib(n-2) end end def fib n if v = @cache.value[n] v else ans = _fib(n) @cache.value[n] = ans end end end fiboner = Fib.new p fiboner.fib(10) #=> 89 pp fiboner.cache.value #=> {1=>1, 0=>1, 2=>2, 3=>3, 4=>5, 5=>8, 6=>13, 7=>21, 8=>34, 9=>55, 10=>89} Ractor.new fiboner do |f2| p f2.fib(5) #=> 8 p f2.cache.value #=> {1=>1, 0=>1, 2=>2, 3=>3, 4=>5, 5=>8} end.take ``` ---------------------------------------- Feature #17323: Ractor::LVar to provide ractor-local storage https://bugs.ruby-lang.org/issues/17323#change-88457 * Author: ko1 (Koichi Sasada) * Status: Open * Priority: Normal ---------------------------------------- Ruby supports thread and fiber local storage: * `Thread#[sym]` provides *Fiber* local storage * `Thread#thread_variable_get(sym) These APIs can access other threads/fibers like that: ```ruby th = Thread.new{ Thread.current.thread_variable_set(:a, 10) } th.join # access from main thread to child thread p th.thread_variable_get(:a) ``` To make Ractor local storage, this kind of feature should not be allowed to protect isolation. This ticket propose alternative API `Ractor::LVar` that allows to provide Ractor local variable. ```ruby LV1 = Ractor::LVar.new p LV1.value #=> nil # default value LV1.value = 'hello' # can set unshareable objects because LVar is ractor local. Ractor.new do LV1.value = 'world' # set Ractor local variable end.take p LV1.value #=> 'hello' # Lvar.new can accept default_proc which should be isolated Proc. LV2 = Ractor::LVar.new{ "x" * 4 } p LV2.value #=> "xxxx" LV2.value = 'yyy' Ractor.new do p LV2.value #=> 'xxx' end p LV2.value #=> 'yyy' ``` This API doesn't support accessing from other ractors. `Ractor::LVar` is from `Ractor::TVar`, but I have no strong opinion about it. For example, `Ractor::LocalVariable` is longer and clearer. Implementation: https://github.com/ruby/ruby/pull/3762 -- https://bugs.ruby-lang.org/ Unsubscribe: