breeder 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -0,0 +1,58 @@
1
+ module Breeder
2
+ module BreedingStrategy
3
+ class Forks
4
+
5
+ def initialize(worker_factory, initial_workers)
6
+ @children = []
7
+ @worker_factory = worker_factory
8
+ @initial_workers = initial_workers
9
+ end
10
+
11
+ def start!
12
+ @initial_workers.times { spawn! }
13
+ end
14
+
15
+ def stop!
16
+ @children.size.times { reap! }
17
+ end
18
+
19
+ def create_worker
20
+ raise "No worker factory specified" unless !!@worker_factory
21
+ worker = @worker_factory.call
22
+ unless [:run, :stop!, :stop?].all? { |method| worker.respond_to?(method) }
23
+ raise "object from worker factory doesn't quack like a worker"
24
+ end
25
+ worker
26
+ end
27
+
28
+ def spawn!
29
+ t = Thread.new do
30
+ if pid = Process.fork
31
+ #parent
32
+ @children << pid
33
+ else
34
+ worker = create_worker
35
+ #child
36
+ trap('HUP') do
37
+ worker.stop!
38
+ end
39
+ trap('INT', 'DEFAULT')
40
+ worker.run
41
+ end
42
+ end
43
+ t.join
44
+ end
45
+
46
+ def reap!
47
+ if !@children.empty?
48
+ pid = @children.pop
49
+ Process.kill('HUP', pid)
50
+ sleep 1
51
+ Process.kill(9, pid)
52
+ end
53
+ end
54
+
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,47 @@
1
+ module Breeder
2
+ module BreedingStrategy
3
+ class Threads
4
+
5
+ def initialize(worker_factory, initial_workers)
6
+ @threads = []
7
+ @workers = []
8
+ @worker_factory = worker_factory
9
+ @initial_workers = initial_workers
10
+ end
11
+
12
+ def start!
13
+ @initial_workers.times { spawn! }
14
+ end
15
+
16
+ def stop!
17
+ @workers.size.times { reap! }
18
+ end
19
+
20
+ def create_worker
21
+ raise "No worker factory specified" unless !!@worker_factory
22
+ worker = @worker_factory.call
23
+ unless [:run, :stop!, :stop?].all? { |method| worker.respond_to?(method) }
24
+ raise "object from worker factory doesn't quack like a worker"
25
+ end
26
+ worker
27
+ end
28
+
29
+ def spawn!
30
+ worker = create_worker
31
+ @workers << worker
32
+ @threads << Thread.new { worker.run }
33
+ end
34
+
35
+ def reap!
36
+ if !@workers.empty?
37
+ thread = @threads.pop
38
+ worker = @workers.pop
39
+ worker.stop!
40
+ sleep 1
41
+ thread.kill
42
+ end
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,8 @@
1
+ require 'breeder/breeding_strategy/threads'
2
+ require 'breeder/breeding_strategy/forks'
3
+
4
+ module Breeder
5
+ module BreedingStrategy
6
+
7
+ end
8
+ end
data/lib/breeder/core.rb CHANGED
@@ -10,8 +10,6 @@ module Breeder
10
10
  attr_accessor :initial_workers
11
11
 
12
12
  def initialize
13
- @workers = []
14
- @threads = []
15
13
  self.interval = 5
16
14
  self.initial_workers = 4
17
15
  end
@@ -38,45 +36,31 @@ module Breeder
38
36
  worker_factory { worker }
39
37
  end
40
38
 
41
- def run
42
- # start the workers
43
- self.initial_workers.times { spawn! }
39
+ def init_strategy
40
+ @strategy = Breeder::BreedingStrategy::Forks.new(@worker_factory, initial_workers)
44
41
 
45
42
  # catch Ctrl+C and cleanup
46
43
  trap('INT') do
47
- puts 'INTERRUPT caught, killing threads and exiting...'
48
- @threads.each { |thread| thread.kill }
44
+ puts 'INTERRUPT caught, killing workers and exiting...'
45
+ @strategy.stop!
46
+ @polling_thread.kill rescue nil
49
47
  end
50
-
51
- # wait for the workers to finish
52
- @threads.each { |thread| thread.join }
53
48
  end
54
49
 
55
- def create_worker
56
- raise "No worker factory specified" unless !!@worker_factory
57
- worker = @worker_factory.call
58
- unless [:run, :stop!, :stop?].all? { |method| worker.respond_to?(method) }
59
- raise "object from worker factory doesn't quack like a worker"
60
- end
61
- worker
62
- end
63
-
64
- private
50
+ def run
51
+ # setup the breeding strategy
52
+ init_strategy
65
53
 
66
- def spawn!
67
- worker = create_worker
68
- @workers << worker
69
- @threads << Thread.new { worker.run }
70
- end
54
+ # start the workers
55
+ @strategy.start!
71
56
 
72
- def reap!
73
- if @threads.size >= 1
74
- thread = @threads.pop
75
- worker = @workers.pop
76
- worker.stop!
77
- sleep 1
78
- thread.kill
57
+ @polling_thread = Thread.new do
58
+ # TODO polling
59
+ loop do
60
+ sleep interval
61
+ end
79
62
  end
63
+ @polling_thread.join
80
64
  end
81
65
 
82
66
  end
data/lib/breeder.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  require 'metaclass'
4
+ require 'breeder/breeding_strategy'
4
5
  require 'breeder/core'
5
6
  require 'breeder/watcher'
6
7
  require 'breeder/worker'
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.1
4
+ version: 0.0.2
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-19 00:00:00.000000000Z
13
+ date: 2011-10-20 00:00:00.000000000Z
14
14
  dependencies: []
15
15
  description:
16
16
  email:
@@ -28,6 +28,9 @@ files:
28
28
  - lib/breeder/worker.rb
29
29
  - lib/breeder/core.rb
30
30
  - lib/breeder/watcher.rb
31
+ - lib/breeder/breeding_strategy.rb
32
+ - lib/breeder/breeding_strategy/forks.rb
33
+ - lib/breeder/breeding_strategy/threads.rb
31
34
  - spec/worker_spec.rb
32
35
  - spec/core_spec.rb
33
36
  - spec/breeder_spec.rb