lifeguard 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e58ec1398c4d3ed7295eddc101b7e0782b7e410
4
- data.tar.gz: a50f5bf81baf9c7b9f61756408dd9ce47affc12b
3
+ metadata.gz: 8c0e136e3ea9cf546ef269e33ebd6b5e1f84fa7f
4
+ data.tar.gz: af7f496ae700677de545303d763bca5eb285d648
5
5
  SHA512:
6
- metadata.gz: e2c8b4660b69d933c3edfb118963e08ae94525a01755f134811e669feff118c84ad4549de81759d155a34f64b635df8361ef752fd0781432644f3b138fa5c599
7
- data.tar.gz: 6b47b9c2b0c397c80819f96b550e79b8938c087293b05f50bf33aa8300ab206cd47bab224b8a34a5771c3c8fea7411c9c56a3bd8e20bdb1749afcc9d4d9b9a09
6
+ metadata.gz: b0d4d7ef4c2f6fa8a18e8dba4ce01ea25f1ae72c838c30833e6316120ee8582fdacafde991d87f02e96dfac7708ae8f68858fe6684572bda33704993702bdfb6
7
+ data.tar.gz: 333d49ff95dd267e49e0e38a3f151729c21b2fee459f5bbb6616c2b6aa8abe24428c870c5bcb9ce871efc5191ed8dbae79358a2347fbb42fe338b9afef430b10
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem install bundler
4
+ rvm:
5
+ - 1.9
6
+ - 2.0
7
+ - 2.1
8
+ - jruby
data/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ [![Build Status](https://travis-ci.org/moneydesktop/lifeguard.svg?branch=master)](https://travis-ci.org/moneydesktop/lifeguard)
2
+
3
+ [![Code Climate](https://codeclimate.com/github/moneydesktop/lifeguard/badges/gpa.svg)](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 @queued_jobs.size > 0
27
- queued_job = @queued_jobs.pop
28
- async(*queued_job[:args], &queued_job[:block])
29
- end
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
@@ -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
- reap!
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
@@ -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
- @reaper = ::Lifeguard::Reaper.new(self, opts[:reaping_interval] || DEFAULT_REAPING_INTERVAL)
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
@@ -1,3 +1,3 @@
1
1
  module Lifeguard
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -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,5 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ::Lifeguard::Reaper do
4
- pending
4
+ skip
5
5
  end
@@ -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 be_false
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 be_true
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 be_false
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 be_false
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 + 1) # +1 for the reaper
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 be_true
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.8
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: 2014-11-11 00:00:00.000000000 Z
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.4.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.