lifeguard 0.0.8 → 0.0.9
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/.travis.yml +8 -0
- data/README.md +4 -0
- data/lib/lifeguard/infinite_threadpool.rb +13 -4
- data/lib/lifeguard/reaper.rb +3 -18
- data/lib/lifeguard/threadpool.rb +16 -2
- data/lib/lifeguard/version.rb +1 -1
- data/lifeguard.gemspec +1 -1
- data/spec/lifeguard/reaper_spec.rb +1 -1
- data/spec/lifeguard/threadpool_spec.rb +32 -7
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c0e136e3ea9cf546ef269e33ebd6b5e1f84fa7f
|
4
|
+
data.tar.gz: af7f496ae700677de545303d763bca5eb285d648
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0d4d7ef4c2f6fa8a18e8dba4ce01ea25f1ae72c838c30833e6316120ee8582fdacafde991d87f02e96dfac7708ae8f68858fe6684572bda33704993702bdfb6
|
7
|
+
data.tar.gz: 333d49ff95dd267e49e0e38a3f151729c21b2fee459f5bbb6616c2b6aa8abe24428c870c5bcb9ce871efc5191ed8dbae79358a2347fbb42fe338b9afef430b10
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
[](https://travis-ci.org/moneydesktop/lifeguard)
|
2
|
+
|
3
|
+
[](https://codeclimate.com/github/moneydesktop/lifeguard)
|
4
|
+
|
1
5
|
lifeguard
|
2
6
|
=========
|
3
7
|
|
@@ -13,6 +13,7 @@ module Lifeguard
|
|
13
13
|
def async(*args, &block)
|
14
14
|
return false if @shutdown
|
15
15
|
|
16
|
+
check_queued_jobs
|
16
17
|
job_started = super
|
17
18
|
|
18
19
|
unless job_started
|
@@ -23,10 +24,12 @@ module Lifeguard
|
|
23
24
|
end
|
24
25
|
|
25
26
|
def check_queued_jobs
|
26
|
-
if
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
return if busy?
|
28
|
+
return if @queued_jobs.size <= 0
|
29
|
+
|
30
|
+
queued_job = @queued_jobs.pop
|
31
|
+
async(*queued_job[:args], &queued_job[:block])
|
32
|
+
check_queued_jobs
|
30
33
|
end
|
31
34
|
|
32
35
|
def kill!(*args)
|
@@ -40,6 +43,12 @@ module Lifeguard
|
|
40
43
|
return_value
|
41
44
|
end
|
42
45
|
|
46
|
+
def prune_busy_threads
|
47
|
+
response = super
|
48
|
+
check_queued_jobs
|
49
|
+
response
|
50
|
+
end
|
51
|
+
|
43
52
|
def shutdown(*args)
|
44
53
|
@shutdown = true
|
45
54
|
super
|
data/lib/lifeguard/reaper.rb
CHANGED
@@ -7,6 +7,7 @@ module Lifeguard
|
|
7
7
|
@threadpool = threadpool
|
8
8
|
@reaping_interval = reaping_interval
|
9
9
|
@thread = ::Thread.new { self.run! }
|
10
|
+
::Thread.pass until alive?
|
10
11
|
end
|
11
12
|
|
12
13
|
##
|
@@ -16,30 +17,14 @@ module Lifeguard
|
|
16
17
|
@thread.alive?
|
17
18
|
end
|
18
19
|
|
19
|
-
def reap!
|
20
|
-
@threadpool.prune_busy_threads
|
21
|
-
end
|
22
|
-
|
23
20
|
def run!
|
24
21
|
loop do
|
25
22
|
sleep(@reaping_interval)
|
26
|
-
|
27
|
-
timeout!
|
28
|
-
ready_thread_count = @threadpool.pool_size - @threadpool.busy_size
|
29
|
-
|
30
|
-
if ready_thread_count > 0 && @threadpool.respond_to?(:check_queued_jobs)
|
31
|
-
ready_thread_count.times do
|
32
|
-
@threadpool.check_queued_jobs
|
33
|
-
end
|
34
|
-
end
|
23
|
+
@threadpool.prune_busy_threads if @threadpool
|
24
|
+
@threadpool.timeout! if @threadpool
|
35
25
|
end
|
36
26
|
rescue
|
37
27
|
retry
|
38
28
|
end
|
39
|
-
|
40
|
-
def timeout!
|
41
|
-
@threadpool.timeout!
|
42
|
-
end
|
43
|
-
|
44
29
|
end
|
45
30
|
end
|
data/lib/lifeguard/threadpool.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
require 'thread'
|
2
|
+
require 'securerandom'
|
2
3
|
|
3
4
|
module Lifeguard
|
4
5
|
class Threadpool
|
5
6
|
DEFAULT_REAPING_INTERVAL = 5 # in seconds
|
6
7
|
DEFAULT_POOL_SIZE = 2
|
7
8
|
|
8
|
-
attr_accessor :pool_size
|
9
|
+
attr_accessor :name, :options, :pool_size
|
9
10
|
|
10
11
|
##
|
11
12
|
# Constructor
|
12
13
|
#
|
13
14
|
def initialize(opts = {})
|
15
|
+
@options = opts
|
16
|
+
@name = opts[:name] || ::SecureRandom.uuid
|
14
17
|
@pool_size = opts[:pool_size] || DEFAULT_POOL_SIZE
|
15
18
|
|
16
19
|
# Important info about "timeout", it is controlled by the reaper
|
@@ -23,12 +26,16 @@ module Lifeguard
|
|
23
26
|
@mutex = ::Mutex.new
|
24
27
|
@busy_threads = []
|
25
28
|
|
26
|
-
|
29
|
+
restart_reaper_unless_alive
|
27
30
|
end
|
28
31
|
|
29
32
|
##
|
30
33
|
# Public Instance Methods
|
31
34
|
#
|
35
|
+
def busy?
|
36
|
+
busy_size >= pool_size
|
37
|
+
end
|
38
|
+
|
32
39
|
def busy_size
|
33
40
|
@busy_threads.size
|
34
41
|
end
|
@@ -49,6 +56,7 @@ module Lifeguard
|
|
49
56
|
|
50
57
|
def async(*args, &block)
|
51
58
|
queued_the_work = false
|
59
|
+
restart_reaper_unless_alive
|
52
60
|
|
53
61
|
unless block
|
54
62
|
raise "Threadpool#async must be passed a block"
|
@@ -129,5 +137,11 @@ module Lifeguard
|
|
129
137
|
@busy_threads.select!(&:alive?)
|
130
138
|
end
|
131
139
|
|
140
|
+
def restart_reaper_unless_alive
|
141
|
+
return if @reaper && @reaper.alive?
|
142
|
+
|
143
|
+
@reaper = ::Lifeguard::Reaper.new(self, options[:reaping_interval] || DEFAULT_REAPING_INTERVAL)
|
144
|
+
end
|
145
|
+
|
132
146
|
end
|
133
147
|
end
|
data/lib/lifeguard/version.rb
CHANGED
data/lifeguard.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["brianastien@gmail.com", "brandonsdewitt@gmail.com"]
|
11
11
|
spec.summary = %q{A Supervised threadpool implementation in ruby.}
|
12
12
|
spec.description = %q{Do you have a threadpool? Do you need someone to watch it? Look no further!}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/moneydesktop/lifeguard"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ::Lifeguard::Threadpool do
|
4
|
-
|
5
4
|
subject { described_class.new(:pool_size => 5) }
|
6
5
|
|
7
6
|
after(:each) do
|
@@ -9,15 +8,40 @@ describe ::Lifeguard::Threadpool do
|
|
9
8
|
sleep(0.1)
|
10
9
|
end
|
11
10
|
|
11
|
+
describe "#busy?" do
|
12
|
+
it "reports false when the busy_size < pool_size" do
|
13
|
+
threadpool = described_class.new(:pool_size => 1, :reaping_interval => 1)
|
14
|
+
expect(threadpool.busy?).to be false
|
15
|
+
end
|
16
|
+
|
17
|
+
it "reports true when the busy_size >= pool_size" do
|
18
|
+
threadpool = described_class.new(:pool_size => 1, :reaping_interval => 1)
|
19
|
+
threadpool.async do
|
20
|
+
sleep(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
expect(threadpool.busy?).to be true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#name" do
|
28
|
+
let(:name) { "AWESOME_NAME" }
|
29
|
+
|
30
|
+
it "allows a name to be set via an option" do
|
31
|
+
threadpool = described_class.new(:name => name, :pool_size => 1, :reaping_interval => 1)
|
32
|
+
expect(threadpool.name).to eq(name)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
12
36
|
describe "#timeout!" do
|
13
37
|
it "doesn't timeout when no timeout set" do
|
14
38
|
threadpool = described_class.new()
|
15
|
-
threadpool.timeout?.should
|
39
|
+
threadpool.timeout?.should be false
|
16
40
|
end
|
17
41
|
|
18
42
|
it "does timeout when timeout set" do
|
19
43
|
threadpool = described_class.new(:timeout => 30)
|
20
|
-
threadpool.timeout?.should
|
44
|
+
threadpool.timeout?.should be true
|
21
45
|
end
|
22
46
|
|
23
47
|
it "uses the reaper to timeout threads that are all wiley" do
|
@@ -39,7 +63,7 @@ describe ::Lifeguard::Threadpool do
|
|
39
63
|
sleep(0.1)
|
40
64
|
subject.kill!
|
41
65
|
sleep(1)
|
42
|
-
@expected.should
|
66
|
+
@expected.should be false
|
43
67
|
end
|
44
68
|
|
45
69
|
it 'rejects all pending tasks' do
|
@@ -49,17 +73,18 @@ describe ::Lifeguard::Threadpool do
|
|
49
73
|
sleep(0.1)
|
50
74
|
subject.kill!
|
51
75
|
sleep(1)
|
52
|
-
@expected.should
|
76
|
+
@expected.should be false
|
53
77
|
end
|
54
78
|
|
55
79
|
it 'kills all threads' do
|
80
|
+
subject
|
56
81
|
before_thread_count = Thread.list.size
|
57
82
|
100.times { subject.async{ sleep(1) } }
|
58
83
|
sleep(0.1)
|
59
84
|
Thread.list.size.should > before_thread_count
|
60
85
|
subject.kill!
|
61
86
|
sleep(0.1)
|
62
|
-
Thread.list.size.should eq(before_thread_count
|
87
|
+
Thread.list.size.should eq(before_thread_count)
|
63
88
|
end
|
64
89
|
end
|
65
90
|
|
@@ -69,7 +94,7 @@ describe ::Lifeguard::Threadpool do
|
|
69
94
|
end
|
70
95
|
|
71
96
|
it 'returns true when the block is added to the queue' do
|
72
|
-
subject.async{ sleep }.should
|
97
|
+
subject.async{ sleep }.should be true
|
73
98
|
end
|
74
99
|
|
75
100
|
it 'calls the block with the given arguments' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lifeguard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Stien
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-02-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: better_receive
|
@@ -119,6 +119,7 @@ extra_rdoc_files: []
|
|
119
119
|
files:
|
120
120
|
- ".gitignore"
|
121
121
|
- ".rspec"
|
122
|
+
- ".travis.yml"
|
122
123
|
- Gemfile
|
123
124
|
- LICENSE.txt
|
124
125
|
- README.md
|
@@ -133,7 +134,7 @@ files:
|
|
133
134
|
- spec/lifeguard/threadpool_spec.rb
|
134
135
|
- spec/spec_helper.rb
|
135
136
|
- spec/support/.gitkeep
|
136
|
-
homepage:
|
137
|
+
homepage: https://github.com/moneydesktop/lifeguard
|
137
138
|
licenses:
|
138
139
|
- MIT
|
139
140
|
metadata: {}
|
@@ -153,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
154
|
version: '0'
|
154
155
|
requirements: []
|
155
156
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
157
|
+
rubygems_version: 2.2.2
|
157
158
|
signing_key:
|
158
159
|
specification_version: 4
|
159
160
|
summary: A Supervised threadpool implementation in ruby.
|