celluloid-pool 0.10.0.pre4 → 0.11.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c55777df2d193b1653956397ba4526b28904008d
4
- data.tar.gz: eae50db2ee716efc701bb49463579332487d13a0
3
+ metadata.gz: b8a5b5a00045d8f76b4aacfed6fd8329459431d1
4
+ data.tar.gz: 3ee6985ed4b292e291f77433ea6ec64d548e902e
5
5
  SHA512:
6
- metadata.gz: d1a4e00cfae73050b102f77ad35b29cc2b50ff5df6b124ad62cb34399ae155c9b2278c10baf2ce65c4e7266d0d84a463ce822956c6afd5abe14b26e2b5780e4a
7
- data.tar.gz: 76ffaea263828668fc2fab44f5ec7244f91a39181d51425da935b92c6ef202c991e1da781abf55dca8ca3ccad54ba8f1ba2a5da04a4d6b7d989d7326b37c71de
6
+ metadata.gz: e685ea4613ddf4a7b3f4aaa56489afec5fc7930188ca539347c60984fe810d7bf7a51aa61491ccce4a51f81b5f45c3b30ff38512e5c7de0502fc65864785131f
7
+ data.tar.gz: 28b9ba837503fcd60f28f4bfeb16f6c7019c0ad44c896b290a25a5055c5936d2865500d9c018c0358c2bde4da5263e3f3340c3b20f26ab22acdfd28e5923f943
@@ -9,6 +9,7 @@ rvm:
9
9
  - rbx-2
10
10
 
11
11
  matrix:
12
+ fast_finish: true
12
13
  allow_failures:
13
14
  - rvm: rbx-2
14
15
  - rvm: ruby-head
data/Gemfile CHANGED
@@ -1,24 +1,2 @@
1
1
  require File.expand_path("../culture/sync", __FILE__)
2
- source "https://rubygems.org"
3
-
4
- gemspec #de development_group: :gem_build_tools
5
-
6
- group :development do
7
- gem "pry"
8
- # de gem 'guard'
9
- # de gem 'guard-rspec'
10
- # de gem 'rb-fsevent', '~> 0.9.1' if RUBY_PLATFORM =~ /darwin/
11
- end
12
-
13
- group :test do
14
- gem "dotenv", "~> 2.0"
15
- gem "nenv"
16
- gem "benchmark_suite"
17
- gem "rspec", "~> 3.2"
18
- end
19
-
20
- group :gem_build_tools do
21
- gem "rake"
22
- end
23
-
24
- Celluloid::Sync.gems(self)
2
+ Celluloid::Sync::Gemfile[self]
@@ -3,7 +3,7 @@ require File.expand_path("../culture/sync", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.name = "celluloid-pool"
6
- gem.version = "0.10.0.pre4"
6
+ gem.version = "0.11.0.pre0"
7
7
  gem.authors = ["Tony Arcieri", "Tim Carey-Smith", "digitalextremist //"]
8
8
  gem.email = ["tony.arcieri@gmail.com", "code@extremist.digital"]
9
9
 
@@ -15,5 +15,5 @@ Gem::Specification.new do |gem|
15
15
  gem.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|examples|spec|features)/}) }
16
16
  gem.require_paths = ["lib"]
17
17
 
18
- Celluloid::Sync.gems(gem)
18
+ Celluloid::Sync::Gemspec[gem]
19
19
  end
@@ -2,29 +2,32 @@ require "set"
2
2
 
3
3
  module Celluloid
4
4
  module ClassMethods
5
+ extend Forwardable
6
+ def_delegators :"Celluloid::Supervision::Container::Pool", :pooling_options
5
7
  # Create a new pool of workers. Accepts the following options:
6
8
  #
7
9
  # * size: how many workers to create. Default is worker per CPU core
8
10
  # * args: array of arguments to pass when creating a worker
9
11
  #
10
- def pool(config={})
11
- Celluloid.services.supervise(config.merge(type: Supervision::Container::Pool, args: [{workers: self}]))
12
- Celluloid.services.actors.last
12
+ def pool(config={}, &block)
13
+ _ = Celluloid.supervise(pooling_options(config, block: block, actors: self))
14
+ _.actors.last
13
15
  end
14
16
 
15
17
  # Same as pool, but links to the pool manager
16
- def pool_link(klass, config={})
17
- Supervision::Container::Pool.new_link(
18
- config.merge(args: [{workers: klass}]),
19
- )
18
+ def pool_link(klass, config={}, &block)
19
+ Supervision::Container::Pool.new_link(pooling_options(config, block: block, actors: klass))
20
20
  end
21
21
  end
22
22
 
23
23
  module Supervision
24
24
  class Container
25
- def pool(klass, config={})
26
- Celluloid.services.supervise(config.merge(type: Container::Pool, args: [{workers: klass}]))
27
- Celluloid.services.actors.last
25
+ extend Forwardable
26
+ def_delegators :"Celluloid::Supervision::Container::Pool", :pooling_options
27
+
28
+ def pool(klass, config={}, &block)
29
+ _ = supervise(pooling_options(config, block: block, actors: klass))
30
+ _.actors.last
28
31
  end
29
32
 
30
33
  class Instance
@@ -33,9 +36,9 @@ module Celluloid
33
36
 
34
37
  class << self
35
38
  # Register a pool of actors to be launched on group startup
36
- def pool(klass, *args, &_block)
39
+ def pool(klass, config, &block)
37
40
  blocks << lambda do |container|
38
- container.pool(klass, Configuration.options(args))
41
+ container.pool(klass, config, &block)
39
42
  end
40
43
  end
41
44
  end
@@ -43,10 +46,17 @@ module Celluloid
43
46
  class Pool
44
47
  include Behavior
45
48
 
49
+ class << self
50
+ def pooling_options(config={},mixins={})
51
+ combined = { :type => Celluloid::Supervision::Container::Pool }.merge(config).merge(mixins)
52
+ combined[:args] = [[:block, :actors, :size, :args].inject({}) { |e,p| e[p] = combined.delete(p) if combined[p]; e }]
53
+ combined
54
+ end
55
+ end
56
+
46
57
  identifier! :size, :pool
47
58
 
48
59
  configuration do
49
- puts "configuring pool"
50
60
  @supervisor = Container::Pool
51
61
  @method = "pool_link"
52
62
  @pool = true
@@ -1,36 +1,34 @@
1
1
  module Celluloid
2
2
  module Supervision
3
3
  class Container
4
- # Manages a fixed-size pool of workers
5
- # Delegates work (i.e. methods) and supervises workers
4
+ # Manages a fixed-size pool of actors
5
+ # Delegates work (i.e. methods) and supervises actors
6
6
  # Don't use this class directly. Instead use MyKlass.pool
7
7
  class Pool
8
-
9
8
  include Celluloid
10
9
 
11
10
  trap_exit :__crash_handler__
12
11
  finalizer :__shutdown__
13
12
 
13
+ attr_reader :size, :actors
14
+
14
15
  def initialize(options={})
15
16
  @idle = []
16
17
  @busy = []
17
- @workers = options[:workers]
18
- @args = {}
19
- @size = 0
18
+ @klass = options[:actors]
19
+ @actors = Set.new
20
+ @mutex = Mutex.new
20
21
 
21
- #de options = Supervision::Configuration.options(options)
22
22
  @size = options[:size] || [Celluloid.cores || 2, 2].max
23
23
  @args = options[:args] ? Array(options[:args]) : []
24
24
 
25
- fail ArgumentError, "minimum pool size is 2" if @size < 2
26
-
27
25
  # Do this last since it can suspend and/or crash
28
- @idle = @size.times.map { @workers.new_link(*@args) }
26
+ @idle = @size.times.map { __spawn_actor__ }
29
27
  end
30
28
 
31
29
  def __shutdown__
32
30
  # TODO: these can be nil if initializer crashes
33
- terminators = (@idle + @busy).map do |actor|
31
+ terminators = @actors.map do |actor|
34
32
  begin
35
33
  actor.future(:terminate)
36
34
  rescue DeadActorError
@@ -41,24 +39,23 @@ module Celluloid
41
39
  end
42
40
 
43
41
  def _send_(method, *args, &block)
44
- worker = __provision_worker__
45
-
42
+ actor = __provision_actor__
46
43
  begin
47
- worker._send_ method, *args, &block
44
+ actor._send_ method, *args, &block
48
45
  rescue DeadActorError # if we get a dead actor out of the pool
49
46
  wait :respawn_complete
50
- worker = __provision_worker__
47
+ actor = __provision_actor__
51
48
  retry
52
49
  rescue Exception => ex
53
50
  abort ex
54
51
  ensure
55
- if worker.alive?
56
- @idle << worker
57
- @busy.delete worker
52
+ if actor.alive?
53
+ @idle << actor
54
+ @busy.delete actor
58
55
 
59
- # Broadcast that worker is done processing and
56
+ # Broadcast that actor is done processing and
60
57
  # waiting idle
61
- signal :worker_idle
58
+ signal :actor_idle
62
59
  end
63
60
  end
64
61
  end
@@ -87,20 +84,18 @@ module Celluloid
87
84
  _send_ :inspect
88
85
  end
89
86
 
90
- attr_reader :size
91
-
92
87
  def size=(new_size)
93
88
  new_size = [0, new_size].max
94
-
95
89
  if new_size > size
96
90
  delta = new_size - size
97
- delta.times { @idle << @workers.new_link(*@args) }
91
+ delta.times { @idle << __spawn_actor__ }
98
92
  else
99
93
  (size - new_size).times do
100
- worker = __provision_worker__
101
- unlink worker
102
- @busy.delete worker
103
- worker.terminate
94
+ actor = __provision_actor__
95
+ unlink actor
96
+ @busy.delete actor
97
+ @actors.delete actor
98
+ actor.terminate
104
99
  end
105
100
  end
106
101
  @size = new_size
@@ -114,28 +109,65 @@ module Celluloid
114
109
  @idle.length
115
110
  end
116
111
 
117
- # Provision a new worker
118
- def __provision_worker__
112
+ def __idle?(actor)
113
+ @idle.include? actor
114
+ end
115
+
116
+ def __busy?(actor)
117
+ @busy.include? actor
118
+ end
119
+
120
+ def __busy
121
+ @busy
122
+ end
123
+
124
+ def __idle
125
+ @idle
126
+ end
127
+
128
+ def __idling?
129
+ @mutex.synchronize { @idle.empty? }
130
+ end
131
+
132
+ def __state(actor)
133
+ return :busy if __busy?(actor)
134
+ return :idle if __idle?(actor)
135
+ :missing
136
+ end
137
+
138
+ # Instantiate an actor, add it to the actor Set, and return it
139
+ def __spawn_actor__
140
+ actor = @klass.new_link(*@args)
141
+ @mutex.synchronize { @actors.add(actor) }
142
+ actor
143
+ end
144
+
145
+ # Provision a new actor ( take it out of idle, move it into busy, and avail it )
146
+ def __provision_actor__
119
147
  Task.current.guard_warnings = true
120
- while @idle.empty?
121
- # Wait for responses from one of the busy workers
148
+ while __idling?
149
+ # Wait for responses from one of the busy actors
122
150
  response = exclusive { receive { |msg| msg.is_a?(Internals::Response) } }
123
151
  Thread.current[:celluloid_actor].handle_message(response)
124
152
  end
125
153
 
126
- worker = @idle.shift
127
- @busy << worker
128
-
129
- worker
154
+ @mutex.synchronize {
155
+ actor = @idle.shift
156
+ @busy << actor
157
+ actor
158
+ }
130
159
  end
131
160
 
132
161
  # Spawn a new worker for every crashed one
133
162
  def __crash_handler__(actor, reason)
134
- @busy.delete actor
135
- @idle.delete actor
163
+ @mutex.synchronize {
164
+ @busy.delete actor
165
+ @idle.delete actor
166
+ @actors.delete actor
167
+ }
136
168
  return unless reason
137
169
 
138
- @idle << @workers.new_link(*@args)
170
+ @idle << __spawn_actor__
139
171
  signal :respawn_complete
140
172
  end
141
173
 
@@ -175,7 +207,7 @@ module Celluloid
175
207
  def method(meth)
176
208
  super
177
209
  rescue NameError
178
- @workers.instance_method(meth.to_sym)
210
+ @klass.instance_method(meth.to_sym)
179
211
  end
180
212
  end
181
213
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: celluloid-pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0.pre4
4
+ version: 0.11.0.pre0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tony Arcieri
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-05-04 00:00:00.000000000 Z
13
+ date: 2015-05-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  requirement: !ruby/object:Gem::Requirement
@@ -32,7 +32,7 @@ dependencies:
32
32
  - - '>='
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
- name: rubocop
35
+ name: nenv
36
36
  prerelease: false
37
37
  type: :runtime
38
38
  version_requirements: !ruby/object:Gem::Requirement
@@ -46,7 +46,7 @@ dependencies:
46
46
  - - '>='
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
- name: coveralls
49
+ name: dotenv
50
50
  prerelease: false
51
51
  type: :runtime
52
52
  version_requirements: !ruby/object:Gem::Requirement
@@ -54,6 +54,90 @@ dependencies:
54
54
  - - '>='
55
55
  - !ruby/object:Gem::Version
56
56
  version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ name: benchmark_suite
64
+ prerelease: false
65
+ type: :development
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ - !ruby/object:Gem::Dependency
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ name: rubocop
78
+ prerelease: false
79
+ type: :development
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ - !ruby/object:Gem::Dependency
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ name: pry
92
+ prerelease: false
93
+ type: :development
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ - !ruby/object:Gem::Dependency
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ name: rake
106
+ prerelease: false
107
+ type: :development
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - '>='
111
+ - !ruby/object:Gem::Version
112
+ version: '0'
113
+ - !ruby/object:Gem::Dependency
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ name: rspec
120
+ prerelease: false
121
+ type: :development
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ name: coveralls
134
+ prerelease: false
135
+ type: :development
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - '>='
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
57
141
  - !ruby/object:Gem::Dependency
58
142
  requirement: !ruby/object:Gem::Requirement
59
143
  requirements: