workers 0.0.1 → 0.0.2
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/.gitignore +1 -0
- data/README.md +62 -3
- data/lib/workers/pool.rb +9 -7
- data/lib/workers/version.rb +1 -1
- data/lib/workers/worker.rb +7 -4
- metadata +1 -3
- data/lib/workers/.pool.rb.swp +0 -0
- data/lib/workers/.worker.rb.swp +0 -0
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Workers
|
2
2
|
|
3
|
-
|
3
|
+
Workers is a Ruby gem for performing work in background threads.
|
4
|
+
Design goals include high performance, low latency, simple API, and customizability.
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
@@ -16,10 +17,68 @@ Or install it yourself as:
|
|
16
17
|
|
17
18
|
$ gem install workers
|
18
19
|
|
19
|
-
## Usage
|
20
|
+
## Basic Usage
|
20
21
|
|
21
|
-
|
22
|
+
# Initialize a worker pool.
|
23
|
+
pool = Workers::Pool.new
|
24
|
+
|
25
|
+
# Perform some work in the background.
|
26
|
+
100.times do
|
27
|
+
pool.perform do
|
28
|
+
sleep(rand(3))
|
29
|
+
puts "Hello world from thread #{Thread.current.object_id}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Tell the workers to shutdown.
|
34
|
+
pool.shutdown do
|
35
|
+
puts "Worker thread #{Thread.current.object_id} is shutting down."
|
36
|
+
end
|
37
|
+
|
38
|
+
# Wait for the workers to finish.
|
39
|
+
pool.join
|
22
40
|
|
41
|
+
## Advanced Usage
|
42
|
+
|
43
|
+
The Worker class is designed to be customized.
|
44
|
+
|
45
|
+
# Create a custom worker class that handles custom commands.
|
46
|
+
class CustomWorker < Workers::Worker
|
47
|
+
private
|
48
|
+
def process_event(event)
|
49
|
+
case event.command
|
50
|
+
when :my_custom
|
51
|
+
puts "Worker received custom event: #{event.data}"
|
52
|
+
sleep(1)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Create a pool that uses your custom worker class.
|
58
|
+
pool = Workers::Pool.new(:worker_class => CustomWorker)
|
59
|
+
|
60
|
+
# Tell the workers to do some work using custom events.
|
61
|
+
100.times do |i|
|
62
|
+
pool.enqueue(:my_custom, i)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Tell the workers to shutdown.
|
66
|
+
pool.shutdown do
|
67
|
+
puts "Worker thread #{Thread.current.object_id} is shutting down."
|
68
|
+
end
|
69
|
+
|
70
|
+
# Wait for it to finish working and shutdown.
|
71
|
+
pool.join
|
72
|
+
|
73
|
+
## Pool Options
|
74
|
+
|
75
|
+
The pool class takes a few options (defaults below):
|
76
|
+
|
77
|
+
pool = Workers::Pool.new(
|
78
|
+
:size => 20, # Number of threads to create.
|
79
|
+
:logger => nil # Ruby Logger instance.
|
80
|
+
:worker_class => Workers::Worker # Class of worker to use for this pool.
|
81
|
+
|
23
82
|
## Contributing
|
24
83
|
|
25
84
|
1. Fork it
|
data/lib/workers/pool.rb
CHANGED
@@ -7,9 +7,17 @@ module Workers
|
|
7
7
|
def initialize(options = {})
|
8
8
|
@size = options[:size] || Workers::Pool::DEFAULT_POOL_SIZE
|
9
9
|
@logger = Workers::LogProxy.new(options[:logger])
|
10
|
+
@worker_class = options[:worker_class] || Workers::Worker
|
11
|
+
|
10
12
|
@input_queue = Queue.new
|
11
13
|
@workers = []
|
12
|
-
@size.times { @workers <<
|
14
|
+
@size.times { @workers << @worker_class.new(:input_queue => @input_queue) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def enqueue(command, data)
|
18
|
+
@input_queue.push(Event.new(command, data))
|
19
|
+
|
20
|
+
return nil
|
13
21
|
end
|
14
22
|
|
15
23
|
def perform(options = {}, &block)
|
@@ -27,11 +35,5 @@ module Workers
|
|
27
35
|
def join(max_wait = nil)
|
28
36
|
return @workers.map { |w| w.join(max_wait) }
|
29
37
|
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def enqueue(command, data)
|
34
|
-
@input_queue.push(Event.new(command, data))
|
35
|
-
end
|
36
38
|
end
|
37
39
|
end
|
data/lib/workers/version.rb
CHANGED
data/lib/workers/worker.rb
CHANGED
@@ -5,9 +5,16 @@ module Workers
|
|
5
5
|
def initialize(options = {})
|
6
6
|
@logger = Workers::LogProxy.new(options[:logger])
|
7
7
|
@input_queue = options[:input_queue] || Queue.new
|
8
|
+
|
8
9
|
@thread = Thread.new { start_event_loop }
|
9
10
|
end
|
10
11
|
|
12
|
+
def enqueue(command, data)
|
13
|
+
@input_queue.push(Event.new(command, data))
|
14
|
+
|
15
|
+
return nil
|
16
|
+
end
|
17
|
+
|
11
18
|
def perform(options = {}, &block)
|
12
19
|
enqueue(:perform, block)
|
13
20
|
|
@@ -30,10 +37,6 @@ module Workers
|
|
30
37
|
|
31
38
|
private
|
32
39
|
|
33
|
-
def enqueue(command, data)
|
34
|
-
@input_queue.push(Event.new(command, data))
|
35
|
-
end
|
36
|
-
|
37
40
|
def start_event_loop
|
38
41
|
while true
|
39
42
|
event = @input_queue.pop # Blocking.
|
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.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -24,8 +24,6 @@ files:
|
|
24
24
|
- README.md
|
25
25
|
- Rakefile
|
26
26
|
- lib/workers.rb
|
27
|
-
- lib/workers/.pool.rb.swp
|
28
|
-
- lib/workers/.worker.rb.swp
|
29
27
|
- lib/workers/event.rb
|
30
28
|
- lib/workers/helpers.rb
|
31
29
|
- lib/workers/log_proxy.rb
|
data/lib/workers/.pool.rb.swp
DELETED
Binary file
|
data/lib/workers/.worker.rb.swp
DELETED
Binary file
|