thread_puddle 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/thread_puddle.rb +32 -6
  2. metadata +2 -2
data/lib/thread_puddle.rb CHANGED
@@ -1,17 +1,24 @@
1
1
  require 'thread'
2
+ require 'securerandom'
2
3
 
3
4
  class ThreadPuddle
4
- attr_reader :size
5
+ attr_reader :size, :state
5
6
 
6
7
  def initialize size = 24
7
8
  @size = size
9
+ @state = :running
8
10
  @queue = Queue.new
9
11
  @pool = size.times.map do
10
12
  Thread.new do
11
13
  catch :exit do
12
14
  loop do
13
- job, args = queue.deq
14
- job.call *args
15
+ job, args, result_queue = queue.deq
16
+
17
+ if result_queue
18
+ result_queue.enq job.call *args
19
+ else # async
20
+ job.call *args
21
+ end
15
22
  end
16
23
  end
17
24
  end
@@ -19,10 +26,27 @@ class ThreadPuddle
19
26
  end
20
27
 
21
28
  def submit *args, &block
22
- queue.enq [block, args]
29
+ if state == :running
30
+ queue.enq [block, args]
31
+ else
32
+ raise "thread pool has been shutdown"
33
+ end
34
+ end
35
+
36
+ def perform *args, &block
37
+ if state == :running
38
+ result_queue = Queue.new
39
+ queue.enq [block, args, result_queue]
40
+
41
+ result_queue.deq
42
+ else
43
+ raise "thread pool has been shutdown"
44
+ end
23
45
  end
24
46
 
25
47
  def shutdown timeout = nil
48
+ state = :shutting_down
49
+
26
50
  size.times do
27
51
  submit do
28
52
  throw :exit
@@ -36,12 +60,14 @@ class ThreadPuddle
36
60
  end
37
61
 
38
62
  queue.clear
39
- size = 0
63
+ state = :terminated
64
+ size = 0
40
65
  end
41
66
 
42
67
  def status
43
68
  {
44
69
  :size => size,
70
+ :state => state,
45
71
  :threads => pool.map(&:status),
46
72
  :queue => {
47
73
  :size => queue.size,
@@ -60,4 +86,4 @@ class ThreadPuddle
60
86
  rescue Timeout::Error
61
87
  pool.each &:kill
62
88
  end
63
- end
89
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thread_puddle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
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-10-15 00:00:00.000000000 Z
12
+ date: 2014-05-02 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: puddles of threads
15
15
  email: