Module: Psyllium::FiberClassMethods
- Included in:
- Fiber
- Defined in:
- lib/psyllium/fiber.rb
Overview
Meant to be used with extend on Fiber class.
Instance Method Summary collapse
-
#start(*args, &block) ⇒ Object
A new method is used to create Psyllium Fibers for several reasons:.
- #state_get(fiber: Fiber.current, create_missing: false) ⇒ Object
Instance Method Details
#start(*args, &block) ⇒ Object
A new method is used to create Psyllium Fibers for several reasons:
-
This ensures that existing behavior for Fibers is not changed.
-
Modifying the actual instances variables of Fibers does not work well with certain schedulers like Async which expect to also wrap the given block in another block.
-
The
startmethod is also available on theThreadclass, so this makes it easy to change out one for the other.
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/psyllium/fiber.rb', line 47 def start(*args, &block) raise ArgumentError.new('No block given') unless block Fiber.schedule do state = state_get(create_missing: true) state.mutex.synchronize do state.started = true state.value = block.call(*args) rescue StandardError => e state.exception = e ensure state.joined = true end end end |
#state_get(fiber: Fiber.current, create_missing: false) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/psyllium/fiber.rb', line 63 def state_get(fiber: Fiber.current, create_missing: false) # Psyllium state is a thread local variable because Fibers cannot (yet) # migrate across threads anyway. # # A `WeakKeyMap` is used so that when a Fiber is garbage collected, the # associated Psyllium::State will be garbage collected as well. state = Thread.current.thread_variable_get(:psyllium_state) || Thread.current.thread_variable_set( :psyllium_state, ObjectSpace::WeakKeyMap.new ) create_missing ? (state[fiber] ||= State.new) : state[fiber] end |