Class: Futuroscope::Future
- Inherits:
-
Delegator
- Object
- Delegator
- Futuroscope::Future
- Extended by:
- Forwardable
- Defined in:
- lib/futuroscope/future.rb
Overview
A Future is an object that gets initialized with a block and will behave exactly like the block’s result, but being able to “borrow” its result from the future. That is, will block when the result is not ready until it is, and will return it instantly if the thread’s execution already finished.
Instance Method Summary collapse
-
#__getobj__ ⇒ Object
(also: #future_value)
Semipublic: Returns the future’s value.
- #__setobj__(obj) ⇒ Object
-
#initialize(pool = ::Futuroscope.default_pool, &block) ⇒ Future
constructor
Initializes a future with a block and starts its execution.
- #marshal_dump ⇒ Object
- #marshal_load(value) ⇒ Object
-
#run_future ⇒ Object
Semipublic: Forces this future to be run.
Constructor Details
#initialize(pool = ::Futuroscope.default_pool, &block) ⇒ Future
Initializes a future with a block and starts its execution.
Examples:
future = Futuroscope::Future.new { sleep(1); :edballs }
sleep(1)
puts future
=> :edballs
# This will return in 1 second and not 2 if the execution wasn't
# deferred to a thread.
pool - A pool where all the futures will be scheduled. block - A block that will be run in the background.
Returns a Future
29 30 31 32 33 34 35 |
# File 'lib/futuroscope/future.rb', line 29 def initialize(pool = ::Futuroscope.default_pool, &block) @queue = ::SizedQueue.new(1) @pool = pool @block = block @mutex = Mutex.new @pool.queue self end |
Instance Method Details
#__getobj__ ⇒ Object Also known as: future_value
Semipublic: Returns the future’s value. Will wait for the future to be completed or return its value otherwise. Can be called multiple times.
Returns the Future’s block execution result.
48 49 50 |
# File 'lib/futuroscope/future.rb', line 48 def __getobj__ resolved_future_value_or_raise[:value] end |
#__setobj__(obj) ⇒ Object
52 53 54 |
# File 'lib/futuroscope/future.rb', line 52 def __setobj__ obj @resolved_future = { value: obj } end |
#marshal_dump ⇒ Object
56 57 58 |
# File 'lib/futuroscope/future.rb', line 56 def marshal_dump resolved_future_value_or_raise end |
#marshal_load(value) ⇒ Object
60 61 62 |
# File 'lib/futuroscope/future.rb', line 60 def marshal_load value @resolved_future = value end |
#run_future ⇒ Object
Semipublic: Forces this future to be run.
38 39 40 41 42 |
# File 'lib/futuroscope/future.rb', line 38 def run_future @queue.push(value: @block.call) rescue ::Exception => e @queue.push(exception: e) end |