future_proof 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/future_proof/exceptionable.rb +3 -0
- data/lib/future_proof/future.rb +29 -0
- data/lib/future_proof/future_array.rb +11 -0
- data/lib/future_proof/future_queue.rb +32 -2
- data/lib/future_proof/thread_pool.rb +22 -4
- data/lib/future_proof/version.rb +1 -1
- data/spec/future_proof/thread_pool_spec.rb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4a0d0a882b8da1f1bf03f83a78fdd5c358312cb
|
4
|
+
data.tar.gz: 7cc74e59ce7c4433bda42268b342702dbba72fd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a325925c0458a6a4ce764e449b66890ac998ba0c6eff8ca18837596d6fb1f91da74c04841566cd53489297a0cc6069a8e9d6e04d9f17a0057614a594fec563c9
|
7
|
+
data.tar.gz: 2ec4705cff77ce7254edb1fc7c6aeb123915199e549c9e50875821f60b931028a5882a4526bf1294d571d377470680b196d9571717f3c6e3748aebcc26df0150
|
@@ -1,8 +1,11 @@
|
|
1
1
|
module FutureProof
|
2
|
+
|
3
|
+
# Module +Exceptionable+ provides methods to read values with exceptions
|
2
4
|
module Exceptionable
|
3
5
|
|
4
6
|
private
|
5
7
|
|
8
|
+
# Returns value or raises exception if its an exception instance
|
6
9
|
def raise_or_value(value)
|
7
10
|
value.is_a?(StandardError) ? raise(value) : value
|
8
11
|
end
|
data/lib/future_proof/future.rb
CHANGED
@@ -1,23 +1,52 @@
|
|
1
1
|
module FutureProof
|
2
|
+
|
3
|
+
# Class +Futures+ can be used to create Procs
|
4
|
+
# that should be executed inside a Thread.
|
2
5
|
class Future
|
6
|
+
|
7
|
+
# Initializes new +Future+.
|
8
|
+
#
|
9
|
+
# @example Initialize +Future+
|
10
|
+
# FutureProof::Future.new { |a, b| a + b }
|
3
11
|
def initialize(&block)
|
4
12
|
@block = block
|
5
13
|
end
|
6
14
|
|
15
|
+
# Executes +Future+ in a thread with given params.
|
16
|
+
#
|
17
|
+
# @param [Array<Object>] *args proc arguments
|
18
|
+
#
|
19
|
+
# @exmaple call +Future+
|
20
|
+
# future.call(2, 2)
|
7
21
|
def call(*args)
|
8
22
|
thread(*args)
|
9
23
|
end
|
10
24
|
|
25
|
+
# Return a result of a +Future+.
|
26
|
+
#
|
27
|
+
# @param [Array<Object>] *args proc arguments if they were not suplied before.
|
28
|
+
#
|
29
|
+
# @note It requires list of arguments if +Future+ was not called before.
|
30
|
+
#
|
31
|
+
# @exmaple Get value of +Future+
|
32
|
+
# future.value
|
11
33
|
def value(*args)
|
12
34
|
thread(*args).value
|
13
35
|
end
|
14
36
|
|
37
|
+
# Return true if Future is done working.
|
38
|
+
#
|
39
|
+
# @exmaple Get state of +Future+
|
40
|
+
# future.complete?
|
41
|
+
#
|
42
|
+
# @return [true, galse] true if +Future+ is done working.
|
15
43
|
def complete?
|
16
44
|
!thread.alive?
|
17
45
|
end
|
18
46
|
|
19
47
|
private
|
20
48
|
|
49
|
+
# Thread that +Future+ is wrapped around.
|
21
50
|
def thread(*args)
|
22
51
|
@thread ||= Thread.new { @block.call *args }
|
23
52
|
end
|
@@ -1,4 +1,8 @@
|
|
1
1
|
module FutureProof
|
2
|
+
|
3
|
+
# +FutureArray+ should be used to raise exceptions
|
4
|
+
# if specific values are exception instances
|
5
|
+
# on a direct access with #[], #first, #last, #each, #sort and so on.
|
2
6
|
class FutureArray
|
3
7
|
include Enumerable
|
4
8
|
include FutureProof::Exceptionable
|
@@ -7,10 +11,14 @@ module FutureProof
|
|
7
11
|
@arry = Array.new arg
|
8
12
|
end
|
9
13
|
|
14
|
+
# Acces +FutureArray+ value by index.
|
10
15
|
def [](index)
|
11
16
|
raise_or_value @arry[index]
|
12
17
|
end
|
13
18
|
|
19
|
+
# Array of values.
|
20
|
+
#
|
21
|
+
# @note raises an exception if any value if an exception.
|
14
22
|
def all
|
15
23
|
map { |a| a }
|
16
24
|
end
|
@@ -21,6 +29,9 @@ module FutureProof
|
|
21
29
|
end
|
22
30
|
end
|
23
31
|
|
32
|
+
# Iterates through array elements.
|
33
|
+
#
|
34
|
+
# @note raises an error if any value is an exception.
|
24
35
|
def each
|
25
36
|
@arry.each { |a| yield raise_or_value(a) }
|
26
37
|
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
module FutureProof
|
2
|
+
|
3
|
+
# +FutureQueue+ is designed to handle exceptions that happen in a threads.
|
4
|
+
# It raises an exception when user tries to access "exceptional" value.
|
2
5
|
class FutureQueue < Queue
|
3
6
|
|
4
7
|
include FutureProof::Exceptionable
|
@@ -8,6 +11,11 @@ module FutureProof
|
|
8
11
|
super()
|
9
12
|
end
|
10
13
|
|
14
|
+
# Pushes value into a queue by executing it.
|
15
|
+
# If execution results in an exception
|
16
|
+
# then exception is stored itself.
|
17
|
+
#
|
18
|
+
# @note allowed only when queue is running.
|
11
19
|
def push(*values, &block)
|
12
20
|
raise_future_proof_exception if finished?
|
13
21
|
value = if block_given?
|
@@ -22,36 +30,58 @@ module FutureProof
|
|
22
30
|
super(value)
|
23
31
|
end
|
24
32
|
|
33
|
+
# Pops value or raises an exception.
|
34
|
+
#
|
35
|
+
# @return [Object] first value of queue.
|
36
|
+
#
|
37
|
+
# @note allowed only when queue is running.
|
25
38
|
def pop
|
26
39
|
raise_future_proof_exception if finished?
|
27
40
|
raise_or_value super
|
28
41
|
end
|
29
42
|
|
43
|
+
# Returns +FutureArray+ with all values.
|
44
|
+
#
|
45
|
+
# @return [FutureProof::FutureArray] Array with values.
|
46
|
+
#
|
47
|
+
# @note allowed only when queue is stopped.
|
30
48
|
def values
|
31
49
|
raise_future_proof_exception unless finished?
|
32
50
|
@values ||= FutureProof::FutureArray.new(instance_variable_get(:@que).dup)
|
33
51
|
end
|
34
52
|
|
53
|
+
# Returns +FutureArray+ with all values.
|
54
|
+
#
|
55
|
+
# @return [Object] value in a queue.
|
56
|
+
#
|
57
|
+
# @note allowed only when queue is stopped.
|
58
|
+
# @note raises an exception if it happened during execution.
|
35
59
|
def [](index)
|
36
60
|
raise_future_proof_exception unless finished?
|
37
61
|
values[index]
|
38
62
|
end
|
39
63
|
|
64
|
+
# Stops queue.
|
40
65
|
def stop!
|
41
66
|
@finished = true
|
42
67
|
end
|
43
68
|
|
69
|
+
# Starts queue.
|
44
70
|
def start!
|
45
71
|
@values = nil
|
46
72
|
@finished = false
|
47
73
|
end
|
48
74
|
|
49
|
-
|
50
|
-
|
75
|
+
# Checks if queue is stopped.
|
76
|
+
#
|
77
|
+
# @return [true, false] true if queue is not working.
|
51
78
|
def finished?
|
52
79
|
@finished
|
53
80
|
end
|
54
81
|
|
82
|
+
private
|
83
|
+
|
84
|
+
# Raises an exception if queue is accessed in the wrong state.
|
55
85
|
def raise_future_proof_exception
|
56
86
|
raise FutureProof::FutureProofException.new 'Queu is not accessible in the state given!'
|
57
87
|
end
|
@@ -1,7 +1,12 @@
|
|
1
1
|
require 'thread'
|
2
2
|
|
3
3
|
module FutureProof
|
4
|
+
|
5
|
+
# +ThreadPool+ could be used to schedule and group threads.
|
4
6
|
class ThreadPool
|
7
|
+
# Initializes a new thread pool.
|
8
|
+
#
|
9
|
+
# @params [FixNum] size the size of the pool thread.
|
5
10
|
def initialize(size)
|
6
11
|
@size = size
|
7
12
|
@threads = []
|
@@ -9,10 +14,21 @@ module FutureProof
|
|
9
14
|
@values = FutureProof::FutureQueue.new
|
10
15
|
end
|
11
16
|
|
17
|
+
# Submits a task to a thread pool.
|
18
|
+
#
|
19
|
+
# @param [Array<Object>] *args job arguments.
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# thread_pool.submit(25, 2) { |a, b| a ** b }
|
23
|
+
#
|
24
|
+
# @note Does not start the execution until #perform is called.
|
12
25
|
def submit(*args, &block)
|
13
26
|
@queue.push [block, args]
|
14
27
|
end
|
15
28
|
|
29
|
+
# Starts execution of the thread pool.
|
30
|
+
#
|
31
|
+
# @note Can be restarted after finalization.
|
16
32
|
def perform
|
17
33
|
unless @threads.any? { |t| t.alive? }
|
18
34
|
@values.start!
|
@@ -30,25 +46,27 @@ module FutureProof
|
|
30
46
|
end
|
31
47
|
end
|
32
48
|
|
49
|
+
# Flags that after all pool jobs are processed thread pool should stop the reactor.
|
33
50
|
def finalize
|
34
51
|
@size.times { @queue.push :END_OF_WORK }
|
35
52
|
end
|
36
53
|
|
54
|
+
# Calls #finalize and block programm flow until all jobs are processed.
|
37
55
|
def wait
|
38
56
|
finalize
|
39
57
|
@threads.map &:join
|
40
58
|
end
|
41
59
|
|
60
|
+
# Calls #wait and returns array of all calculated values.
|
61
|
+
#
|
62
|
+
# @return [FutureProof::FutureArray] instance of FutureArray with all values.
|
42
63
|
def values
|
43
64
|
wait
|
44
65
|
@values.stop!
|
45
66
|
@values.values
|
46
67
|
end
|
47
68
|
|
48
|
-
|
49
|
-
@size.times { @queue.push :END_OF_WORK }
|
50
|
-
end
|
51
|
-
|
69
|
+
# Commands to remove all pool tasks and finishes the execution after all running tasks are completed.
|
52
70
|
def finalize!
|
53
71
|
@queue.clear
|
54
72
|
finalize
|
data/lib/future_proof/version.rb
CHANGED
@@ -71,7 +71,11 @@ describe FutureProof::ThreadPool do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
describe 'exceptions' do
|
74
|
-
before
|
74
|
+
before do
|
75
|
+
thread_pool.submit 24, 0 do |a, b|
|
76
|
+
a / b
|
77
|
+
end
|
78
|
+
end
|
75
79
|
|
76
80
|
context 'without asking for specific value' do
|
77
81
|
it 'should not raise exceptions' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: future_proof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nikita Cernovs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|