класс Thread
Общедоступные методы экземпляра
# File activesupport/lib/active_support/core_ext/thread.rb, line 72 def freeze _locals.freeze super end
Замораживает поток, чтобы локальные переменные потока нельзя было установить с помощью #thread_variable_set, а также нельзя было установить локальные переменные волокна.
me = Thread.current me.freeze me.thread_variable_set(:oliver, "a") #=> RuntimeError: can't modify frozen thread locals me[:oliver] = "a" #=> RuntimeError: can't modify frozen thread locals
# File activesupport/lib/active_support/core_ext/thread.rb, line 61 def thread_variable?(key) _locals.has_key?(key.to_sym) end
Возвращает true, если заданная строка (или символ) существует в качестве локальной переменной потока.
me = Thread.current me.thread_variable_set(:oliver, "a") me.thread_variable?(:oliver) # => true me.thread_variable?(:stanley) # => false
Обратите внимание, что это не локальные переменные волокна. Подробнее см. #thread_variable_get.
# File activesupport/lib/active_support/core_ext/thread.rb, line 25 def thread_variable_get(key) _locals[key.to_sym] end
Возвращает значение локальной переменной потока, которое было установлено. Обратите внимание, что эти значения отличаются от локальных значений волокна.
Поток локальные значения переносятся вместе с потоками и не учитывают волокна. Например:
Thread.new {
Thread.current.thread_variable_set("foo", "bar") # set a thread local
Thread.current["foo"] = "bar" # set a fiber local
Fiber.new {
Fiber.yield [
Thread.current.thread_variable_get("foo"), # get the thread local
Thread.current["foo"], # get the fiber local
]
}.resume
}.join.value # => ['bar', nil]
Значение "bar" возвращается для локальной переменной потока, где nil возвращается для локальной переменной волокна. Волокно выполняется в том же потоке, поэтому доступны локальные переменные потока.
# File activesupport/lib/active_support/core_ext/thread.rb, line 32 def thread_variable_set(key, value) _locals[key.to_sym] = value end
Устанавливает локальную переменную потока с key на value. Обратите внимание, что эти переменные локальны для потоков, а не для волокон. Подробнее см. #thread_variable_get.
# File activesupport/lib/active_support/core_ext/thread.rb, line 47 def thread_variables _locals.keys end
Возвращает массив имен локальных переменных потока (в качестве символов).
thr = Thread.new do
Thread.current.thread_variable_set(:cat, 'meow')
Thread.current.thread_variable_set("dog", 'woof')
end
thr.join # => #<Thread:0x401b3f10 dead>
thr.thread_variables # => [:dog, :cat]
Обратите внимание, что это не локальные переменные волокна. Подробнее см. #thread_variable_get.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.