breeder 0.0.2 → 0.0.3
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.
- data/lib/breeder/breeding_strategy/forks.rb +5 -0
- data/lib/breeder/breeding_strategy/threads.rb +4 -0
- data/lib/breeder/core.rb +16 -5
- data/lib/breeder/watcher/base.rb +11 -0
- data/lib/breeder/watcher/beanstalk.rb +30 -0
- data/lib/breeder/watcher.rb +4 -13
- data/lib/breeder.rb +1 -1
- data/spec/core_spec.rb +5 -14
- data/spec/spec_helper.rb +2 -0
- metadata +4 -2
@@ -8,6 +8,10 @@ module Breeder
|
|
8
8
|
@initial_workers = initial_workers
|
9
9
|
end
|
10
10
|
|
11
|
+
def num_workers
|
12
|
+
@children.size
|
13
|
+
end
|
14
|
+
|
11
15
|
def start!
|
12
16
|
@initial_workers.times { spawn! }
|
13
17
|
end
|
@@ -38,6 +42,7 @@ module Breeder
|
|
38
42
|
end
|
39
43
|
trap('INT', 'DEFAULT')
|
40
44
|
worker.run
|
45
|
+
Process.exit
|
41
46
|
end
|
42
47
|
end
|
43
48
|
t.join
|
data/lib/breeder/core.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Breeder
|
2
2
|
class Core
|
3
|
-
# the poll interval in seconds
|
3
|
+
# the poll interval in seconds (default is 60)
|
4
4
|
attr_accessor :interval
|
5
5
|
|
6
6
|
# an instance with spawn? and reap? methods to determine when to spawn and reap
|
@@ -10,13 +10,13 @@ module Breeder
|
|
10
10
|
attr_accessor :initial_workers
|
11
11
|
|
12
12
|
def initialize
|
13
|
-
self.interval =
|
13
|
+
self.interval = 6
|
14
14
|
self.initial_workers = 4
|
15
15
|
end
|
16
16
|
|
17
17
|
def watcher=(watcher)
|
18
|
-
unless watcher.respond_to?(:
|
19
|
-
raise "Watcher must implement
|
18
|
+
unless watcher.respond_to?(:check)
|
19
|
+
raise "Watcher must implement 'check' method"
|
20
20
|
end
|
21
21
|
|
22
22
|
@watcher = watcher
|
@@ -54,9 +54,20 @@ module Breeder
|
|
54
54
|
# start the workers
|
55
55
|
@strategy.start!
|
56
56
|
|
57
|
+
warn "No Watcher specified, will not spawn or reap workers" if @watcher.nil?
|
58
|
+
|
57
59
|
@polling_thread = Thread.new do
|
58
|
-
# TODO polling
|
59
60
|
loop do
|
61
|
+
if !!@watcher
|
62
|
+
decision = @watcher.check(@strategy.num_workers)
|
63
|
+
if :spawn == decision
|
64
|
+
@strategy.spawn!
|
65
|
+
puts "Spawned worker, now running #{@strategy.num_workers} workers"
|
66
|
+
elsif :reap == decision
|
67
|
+
@strategy.reap!
|
68
|
+
puts "Reaped worker, now running #{@strategy.num_workers} workers"
|
69
|
+
end
|
70
|
+
end
|
60
71
|
sleep interval
|
61
72
|
end
|
62
73
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Breeder
|
2
|
+
module Watcher
|
3
|
+
class Beanstalk < Base
|
4
|
+
|
5
|
+
def initialize(client, tube, max_workers)
|
6
|
+
raise "max_workers must be at least 1" if max_workers < 1
|
7
|
+
@client, @tube, @max_workers = client, tube, max_workers
|
8
|
+
@last_check = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def check(num_workers)
|
12
|
+
num = jobs_ready
|
13
|
+
if !!@last_check && num > @last_check && num_workers <= @max_workers
|
14
|
+
decision = :spawn
|
15
|
+
elsif !!@last_check && num < 0.5 * @last_check
|
16
|
+
decision = :reap
|
17
|
+
else
|
18
|
+
decision = nil
|
19
|
+
end
|
20
|
+
@last_check = num
|
21
|
+
decision
|
22
|
+
end
|
23
|
+
|
24
|
+
def jobs_ready
|
25
|
+
@client.stats_tube(@tube)['current-jobs-ready']
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/breeder/watcher.rb
CHANGED
@@ -1,16 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# A watcher has a spawn? and reap? method that indicate when to
|
4
|
-
# spawn and reap more threads
|
5
|
-
class Watcher
|
6
|
-
|
7
|
-
def spawn?(num_workers)
|
8
|
-
raise NotImplementedError
|
9
|
-
end
|
10
|
-
|
11
|
-
def reap?(num_workers)
|
12
|
-
raise NotImplementedError
|
13
|
-
end
|
1
|
+
require 'breeder/watcher/base'
|
2
|
+
require 'breeder/watcher/beanstalk'
|
14
3
|
|
4
|
+
module Breeder
|
5
|
+
module Watcher
|
15
6
|
end
|
16
7
|
end
|
data/lib/breeder.rb
CHANGED
data/spec/core_spec.rb
CHANGED
@@ -15,26 +15,16 @@ module Breeder
|
|
15
15
|
|
16
16
|
context 'when the argument is a valid watcher' do
|
17
17
|
it 'sets the watcher' do
|
18
|
-
watcher = Breeder::Watcher.new
|
18
|
+
watcher = Breeder::Watcher::Beanstalk.new(mock('stalk'), 'tube', 8)
|
19
19
|
@core.watcher = watcher
|
20
20
|
@core.watcher.should == watcher
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
describe '#
|
26
|
-
|
27
|
-
|
28
|
-
lambda { @core.worker= 42 }.should raise_error
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'when the argument is a valid worker' do
|
33
|
-
it 'sets the worker' do
|
34
|
-
test_worker = Breeder::Worker.new
|
35
|
-
@core.worker_factory { test_worker }
|
36
|
-
@core.create_worker.should == test_worker
|
37
|
-
end
|
25
|
+
describe '#worker_factory' do
|
26
|
+
it 'sets the worker factory' do
|
27
|
+
pending
|
38
28
|
end
|
39
29
|
end
|
40
30
|
|
@@ -47,6 +37,7 @@ module Breeder
|
|
47
37
|
|
48
38
|
context 'when a block of work is supplied' do
|
49
39
|
it 'creates a worker with the block as its workload' do
|
40
|
+
pending 'no create_watcher method'
|
50
41
|
task_done = false
|
51
42
|
@core.task { task_done = true }
|
52
43
|
@core.create_worker.do_work
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: breeder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2011-10-
|
13
|
+
date: 2011-10-21 00:00:00.000000000Z
|
14
14
|
dependencies: []
|
15
15
|
description:
|
16
16
|
email:
|
@@ -29,6 +29,8 @@ files:
|
|
29
29
|
- lib/breeder/core.rb
|
30
30
|
- lib/breeder/watcher.rb
|
31
31
|
- lib/breeder/breeding_strategy.rb
|
32
|
+
- lib/breeder/watcher/base.rb
|
33
|
+
- lib/breeder/watcher/beanstalk.rb
|
32
34
|
- lib/breeder/breeding_strategy/forks.rb
|
33
35
|
- lib/breeder/breeding_strategy/threads.rb
|
34
36
|
- spec/worker_spec.rb
|