parallizer 0.3.1 → 0.4.0

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/Gemfile.lock CHANGED
@@ -1,15 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- parallizer (0.3.1)
5
- work_queue
4
+ parallizer (0.4.0)
5
+ celluloid (~> 0.11.0)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
10
  always_execute (0.1.3)
11
+ celluloid (0.11.1)
12
+ timers (>= 1.0.0)
11
13
  diff-lcs (1.1.3)
12
- rake (0.9.2.2)
14
+ rake (10.0.3)
13
15
  rspec (2.9.0)
14
16
  rspec-core (~> 2.9.0)
15
17
  rspec-expectations (~> 2.9.0)
@@ -18,7 +20,7 @@ GEM
18
20
  rspec-expectations (2.9.1)
19
21
  diff-lcs (~> 1.1.3)
20
22
  rspec-mocks (2.9.0)
21
- work_queue (2.5.2)
23
+ timers (1.1.0)
22
24
 
23
25
  PLATFORMS
24
26
  ruby
data/lib/parallizer.rb CHANGED
@@ -1,6 +1,6 @@
1
- require 'work_queue'
2
1
  require 'parallizer/version'
3
2
  require 'parallizer/proxy'
3
+ require 'parallizer/worker'
4
4
  require 'parallizer/method_call_notifier'
5
5
 
6
6
  class Parallizer
@@ -8,81 +8,72 @@ class Parallizer
8
8
 
9
9
  class << self
10
10
  def work_queue_size
11
- work_queue.max_threads
11
+ @work_queue_size || DEFAULT_WORK_QUEUE_SIZE
12
12
  end
13
13
 
14
- def work_queue_size=(size)
15
- work_queue = Thread.current[:parallizer_work_queue]
16
- if work_queue.nil? || work_queue.max_threads != size
17
- Thread.current[:parallizer_work_queue] = WorkQueue.new(size)
18
- end
14
+ def work_queue_size=(work_queue_size)
15
+ @work_queue_size = work_queue_size
19
16
  end
20
-
17
+
21
18
  def work_queue
22
- # TODO: share the work queue among calling threads
23
- Thread.current[:parallizer_work_queue] ||= WorkQueue.new(DEFAULT_WORK_QUEUE_SIZE)
19
+ # TODO: share the work queue among calling threads??
20
+ queue = Thread.current[:parallizer_work_queue]
21
+ if queue.nil? || Thread.current[:parallizer_work_queue_size] != work_queue_size
22
+ queue = Thread.current[:parallizer_work_queue] = ::Parallizer::Worker.pool(:size => work_queue_size)
23
+ Thread.current[:parallizer_work_queue_size] = work_queue_size
24
+ end
25
+
26
+ queue
24
27
  end
25
28
  end
26
29
 
27
30
  attr_reader :calls, :call_infos, :client, :proxy, :options
28
-
31
+
29
32
  def initialize(client, options = {})
30
33
  @client = client
31
34
  @options = {:retries => 0}.merge(options)
32
35
  @call_infos = {}
33
36
  end
34
-
37
+
35
38
  def add
36
- MethodCallNotifier.new do |*args|
39
+ ::Parallizer::MethodCallNotifier.new do |*args|
37
40
  add_call(*args)
38
41
  end
39
42
  end
40
-
43
+
41
44
  def calls
42
45
  @call_infos.keys
43
46
  end
44
-
47
+
45
48
  def add_call(method_name, *args)
46
49
  raise ArgumentError, "Cannot add calls after proxy has been generated" if @proxy
47
-
50
+
48
51
  method_name_and_args = [method_name.to_sym, *args]
49
52
  return if call_infos[method_name_and_args]
50
-
53
+
51
54
  call_info = {
55
+ :future => ::Parallizer::work_queue.future(:run, @client, method_name, args, options),
52
56
  :result => nil,
53
- :exception => nil,
54
- :retries => options[:retries]
57
+ :exception => nil
55
58
  }
56
59
  call_infos[method_name_and_args] = call_info
57
60
  end
58
-
61
+
59
62
  def create_proxy
60
63
  raise ArgumentError, "Cannot create another proxy" if @proxy
61
-
64
+
62
65
  execute
63
-
64
- Parallizer::Proxy.new(client, call_infos)
66
+
67
+ ::Parallizer::Proxy.new(client, call_infos)
65
68
  end
66
-
69
+
67
70
  private
68
-
71
+
69
72
  def execute
70
73
  call_infos.each do |method_name_and_args, call_info|
71
- Parallizer.work_queue.enqueue_b do
72
- (call_info[:retries] + 1).times do
73
- begin
74
- call_info[:exception] = nil # reset exception before each send attempt
75
- call_info[:result] = client.send(*method_name_and_args)
76
- break # success
77
- rescue Exception => e
78
- call_info[:exception] = e
79
- end
80
- end
81
- end
74
+ call_info.merge!(call_info[:future].value)
82
75
  end
83
-
84
- Parallizer.work_queue.join
85
76
 
86
- Parallizer::Proxy.new(client, call_infos)
77
+ ::Parallizer::Proxy.new(client, call_infos)
87
78
  end
88
79
  end
@@ -1,3 +1,3 @@
1
1
  class Parallizer
2
- VERSION = "0.3.1"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -0,0 +1,24 @@
1
+ require 'celluloid'
2
+
3
+ class Parallizer
4
+ class Worker
5
+ include Celluloid
6
+
7
+ def run(client, method_name, args, options)
8
+ result = {}
9
+
10
+ (options[:retries] + 1).times do
11
+ begin
12
+ result[:exception] = nil # reset exception before each send attempt
13
+ result[:result] = client.send(method_name, *args)
14
+ break # success
15
+ rescue Exception => e
16
+ result[:exception] = e
17
+ end
18
+ end
19
+
20
+ result
21
+ end
22
+ end
23
+ end
24
+
data/parallizer.gemspec CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency 'work_queue'
21
+ s.add_dependency 'celluloid', '~> 0.11.0'
22
22
  s.add_development_dependency 'rake'
23
23
  s.add_development_dependency 'rspec', '~> 2.9.0'
24
24
  s.add_development_dependency 'always_execute', '~> 0.1.1'
@@ -1,20 +1,19 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Parallizer::Proxy do
4
- DEFAULT_RETURN_VALUE = "return value"
4
+ CLIENT_RETURN_VALUE = "client return value"
5
5
 
6
- class TestObject
6
+ class ClientTestObject
7
7
  def a_method(arg)
8
- DEFAULT_RETURN_VALUE
8
+ CLIENT_RETURN_VALUE
9
9
  end
10
10
  end
11
11
 
12
12
  describe "#method_missing" do
13
13
  before do
14
- @client = TestObject.new
14
+ @client = ClientTestObject.new
15
15
  @call_key = []
16
- @call_info = {:result => nil, :exception => nil, :complete? => true,
17
- :condition_variable => ConditionVariable.new, :mutex => Mutex.new }
16
+ @call_info = {:result => nil, :exception => nil }
18
17
  end
19
18
 
20
19
  execute do
@@ -43,7 +42,7 @@ describe Parallizer::Proxy do
43
42
  end
44
43
  a_calling_thread_method
45
44
  end
46
-
45
+
47
46
  it "should raise exception" do
48
47
  @execute_result.class.should == @call_info[:exception].class
49
48
  @execute_result.message.should == @call_info[:exception].message
@@ -73,7 +72,7 @@ describe Parallizer::Proxy do
73
72
  end
74
73
 
75
74
  it "should return value from client object" do
76
- @execute_result.should == DEFAULT_RETURN_VALUE
75
+ @execute_result.should == CLIENT_RETURN_VALUE
77
76
  end
78
77
  end
79
78
  end
@@ -92,10 +91,9 @@ describe Parallizer::Proxy do
92
91
 
93
92
  describe "#respond_to?" do
94
93
  before do
95
- client = TestObject.new
94
+ client = ClientTestObject.new
96
95
  call_key = [:a_method, 'valid argument']
97
- call_info = {:result => nil, :exception => nil, :complete? => true,
98
- :condition_variable => ConditionVariable.new, :mutex => Mutex.new }
96
+ call_info = {:result => nil, :exception => nil }
99
97
  @proxy = Parallizer::Proxy.new(client, { call_key => call_info })
100
98
  end
101
99
 
@@ -191,10 +191,11 @@ describe Parallizer do
191
191
  Parallizer.work_queue_size.should == Parallizer::DEFAULT_WORK_QUEUE_SIZE
192
192
  end
193
193
 
194
- it "should have max threads equal to specified size" do
194
+ it "should have max threads equal to specified size after requesting the work queue" do
195
195
  size = rand(2..5)
196
196
  Parallizer.work_queue_size = size
197
- Parallizer.work_queue.max_threads.should == size
197
+ Parallizer.work_queue
198
+ Thread.current[:parallizer_work_queue_size].should == size
198
199
  end
199
200
  end
200
201
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parallizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,24 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-08 00:00:00.000000000 Z
12
+ date: 2013-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: work_queue
15
+ name: celluloid
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: 0.11.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: 0.11.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: rake
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +92,7 @@ files:
92
92
  - lib/parallizer/method_call_notifier.rb
93
93
  - lib/parallizer/proxy.rb
94
94
  - lib/parallizer/version.rb
95
+ - lib/parallizer/worker.rb
95
96
  - parallizer.gemspec
96
97
  - spec/parallizer/method_call_notifier_spec.rb
97
98
  - spec/parallizer/proxy_spec.rb
@@ -111,7 +112,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
112
  version: '0'
112
113
  segments:
113
114
  - 0
114
- hash: 1371680506904516612
115
+ hash: -3493791193896419767
115
116
  required_rubygems_version: !ruby/object:Gem::Requirement
116
117
  none: false
117
118
  requirements:
@@ -120,10 +121,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
121
  version: '0'
121
122
  segments:
122
123
  - 0
123
- hash: 1371680506904516612
124
+ hash: -3493791193896419767
124
125
  requirements: []
125
126
  rubyforge_project: parallizer
126
- rubygems_version: 1.8.24
127
+ rubygems_version: 1.8.25
127
128
  signing_key:
128
129
  specification_version: 3
129
130
  summary: Execute your service layer in parallel