workers 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.
data/README.md CHANGED
@@ -17,7 +17,7 @@ Or install it yourself as:
17
17
 
18
18
  $ gem install workers
19
19
 
20
- ## Basic Usage
20
+ ## Workers - Basic
21
21
 
22
22
  # Initialize a worker pool.
23
23
  pool = Workers::Pool.new
@@ -38,7 +38,7 @@ Or install it yourself as:
38
38
  # Wait for the workers to shutdown.
39
39
  pool.join
40
40
 
41
- ## Advanced Usage
41
+ ## Workers - Advanced
42
42
 
43
43
  The Worker class is designed to be customized through inheritence and its event system:
44
44
 
@@ -70,6 +70,9 @@ The Worker class is designed to be customized through inheritence and its event
70
70
  # Wait for the workers to shutdown.
71
71
  pool.join
72
72
 
73
+ Note that you can use custom workers without a pool.
74
+ This effectively gives you direct access to a single event driven thread.
75
+
73
76
  ## Timers
74
77
 
75
78
  Timers provide a way to execute code in the future:
@@ -83,10 +86,35 @@ Timers provide a way to execute code in the future:
83
86
  timer = Workers::PeriodicTimer.new(1) do
84
87
  puts 'Hello world many times'
85
88
  end
86
- sleep 5
89
+
90
+ # Let the timer print some lines.
91
+ sleep(5)
92
+
93
+ # Shutdown the timer.
87
94
  timer.cancel
88
95
 
89
- Callbacks execute using a Workers::Pool in case they contain blocking operations.
96
+ ## Schedulers
97
+
98
+ Schedulers are what trigger Timers to fire.
99
+ The system has a global default scheduler which should meet most needs (Workers.scheduler).
100
+ You can create additional or custom ones as necessary:
101
+
102
+ # Create a workers pool with a larger than default thread count (optional).
103
+ pool = Workers::Pool.new(:size => 100)
104
+
105
+ # Create a scheduler.
106
+ scheduler = Workers::Scheduler.new(:pool => pool)
107
+
108
+ # Create a timer that uses the above scheduler.
109
+ timer = Workers::Timer.new(1, :scheduler => scheduler) do
110
+ puts 'Hello world'
111
+ end
112
+
113
+ # Wait for the timer to fire.
114
+ sleep(5)
115
+
116
+ # Shutdown the scheduler.
117
+ scheduler.dispose
90
118
 
91
119
  ## Options (defaults below):
92
120
 
@@ -114,6 +142,11 @@ Callbacks execute using a Workers::Pool in case they contain blocking operations
114
142
  :callback => nil # The proc to execute (provide this or a block, but not both).
115
143
  )
116
144
 
145
+ scheduler = Workers::Scheduler.new(
146
+ :logger => nil, # Ruby logger instance.
147
+ :pool => Workers::Pool.new # The workers pool used to execute timer callbacks.
148
+ )
149
+
117
150
 
118
151
  ## TODO - not yet implemented features
119
152
 
data/lib/workers/pool.rb CHANGED
@@ -5,8 +5,8 @@ module Workers
5
5
  DEFAULT_POOL_SIZE = 20
6
6
 
7
7
  def initialize(options = {})
8
- @size = options[:size] || Workers::Pool::DEFAULT_POOL_SIZE
9
8
  @logger = Workers::LogProxy.new(options[:logger])
9
+ @size = options[:size] || Workers::Pool::DEFAULT_POOL_SIZE
10
10
  @worker_class = options[:worker_class] || Workers::Worker
11
11
 
12
12
  @input_queue = Queue.new
@@ -1,6 +1,9 @@
1
1
  module Workers
2
2
  class Scheduler
3
+ include Workers::Helpers
4
+
3
5
  def initialize(options = {})
6
+ @logger = Workers::LogProxy.new(options[:logger])
4
7
  @pool = options[:pool] || Workers::Pool.new
5
8
  @schedule = SortedSet.new
6
9
  @mutex = Mutex.new
@@ -41,6 +44,10 @@ module Workers
41
44
  return nil
42
45
  end
43
46
 
47
+ def alive?
48
+ return @thread && @thread.alive?
49
+ end
50
+
44
51
  private
45
52
 
46
53
  def start_loop
data/lib/workers/timer.rb CHANGED
@@ -1,14 +1,16 @@
1
1
  module Workers
2
2
  class Timer
3
+ include Workers::Helpers
4
+
3
5
  attr_reader :delay
4
6
  attr_reader :repeat
5
7
 
6
8
  def initialize(delay, options = {}, &block)
9
+ @logger = Workers::LogProxy.new(options[:logger])
7
10
  @delay = delay
8
11
  @callback = options[:callback] || block
9
12
  @repeat = options[:repeat] || false
10
13
  @scheduler = options[:scheduler] || Workers.scheduler
11
- @logger = options[:logger]
12
14
 
13
15
  @mutex = Mutex.new
14
16
 
@@ -1,3 +1,3 @@
1
1
  module Workers
2
- VERSION = "0.0.3"
2
+ VERSION = '0.0.4'
3
3
  end
@@ -28,45 +28,59 @@ module Workers
28
28
  end
29
29
 
30
30
  def join(max_wait = nil)
31
- raise "Worker can't join itself!" if @thread == Thread.current
31
+ raise "Worker can't join itself." if @thread == Thread.current
32
32
 
33
33
  return true if !@thread.join(max_wait).nil?
34
34
 
35
35
  @thread.kill and return false
36
36
  end
37
37
 
38
+ def alive?
39
+ return @thread && @thread.alive?
40
+ end
41
+
38
42
  private
39
43
 
40
44
  def start_event_loop
41
45
  while true
42
- event = @input_queue.pop # Blocking.
46
+ event = @input_queue.pop
43
47
 
44
48
  case event.command
45
49
  when :shutdown
46
- try_callback(event.data) do |e|
47
- log_error("Worker failed run 'shutdown' callback.", e)
48
- end
49
- return
50
+ shutdown_handler(event)
51
+ return nil
50
52
  when :perform
51
- try_callback(event.data) do |e|
52
- log_error("Worker failed run 'perform' callback.", e)
53
- end
53
+ perform_handler(event)
54
54
  else
55
55
  process_event(event)
56
56
  end
57
57
  end
58
+ rescue Exception => e
59
+ exception_handler(e)
60
+ end
61
+
62
+ def shutdown_handler(event)
63
+ try_callback(event.data)
64
+ end
65
+
66
+ def perform_handler(event)
67
+ try_callback(event.data)
68
+ end
69
+
70
+ def exception_handler(e)
71
+ puts concat_e('Worker event loop died.', e)
58
72
  end
59
73
 
60
74
  def try_callback(callback, &block)
61
75
  begin
62
76
  callback.call
63
77
  rescue Exception => e
64
- block.call(e)
78
+ block.call(e) if block
65
79
  end
66
80
  end
67
81
 
68
82
  def process_event(event)
69
- raise 'Subclass and override if you need custom commands.'
83
+ raise "Unhandled event (#{event.inspect}). Subclass and override if you need custom events."
70
84
  end
71
85
  end
72
86
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-18 00:00:00.000000000 Z
12
+ date: 2013-01-19 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Simple Ruby workers for performing work in background threads.
15
15
  email: