proc调用存储在类变量thread中是否安全?

时间:2013-01-25 10:32:57

标签: ruby-on-rails ruby thread-safety

如果我将块存储在控制器的类变量中,然后从实例调用它,是否会导致线程范围出现问题? 传递给块的参数对于每个实例都是本地的。

以下是代码示例:

class BlockExecutor
  def initialize(&block)
    self.instance_eval &block
  end
  def sub_block(&block)
    @block = block
  end
  def call(object)
    @block.call(object)
  end
end

module ClassDSL
  extend ActiveSupport::Concern
  module ClassMethods
    def define(&block)
      @executor = BlockExecutor.new &block
    end

    def execute_block(object)
      @executor.call(object)
    end
  end
end

class Controller
  include ClassDSL

  define do 
    sub_block do |object|
      # mutate object
    end
  end

  def run
    new_object = self.class.execute_block(object)
  end
end

1 个答案:

答案 0 :(得分:0)

首先,我认为您在控制器中忘记了以下内容:

class Controller
  include ClassDSL
  extend ClassDSL::ClassMethods
  ...
end

或者可能来自ClassDSL模块:

module ClassDSL
  def self.included(base)
    base.extend(ClassMethods)
  end
  ..
end

那就是说,你真的在​​谈论线程还是只是进程?使用进程,你没有问题,但是一旦你使用线程来运行动作,多个线程将共享@executor类 - 实例变量,所以每当你运行存储在那里的块时,你永远不会知道哪个线程负责它的定义。

所以最后,它取决于你在块中执行的代码以及是否只改变本地范围的变量。您的“对象”似乎是本地的,但可能很容易引用线程范围之外的其他对象。