arsenicum 0.3.1.2 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14f630cddca6963437610dc104f8f5f04d8da3c5
4
- data.tar.gz: c02744a60e0007ef9322d586407976b0432da431
3
+ metadata.gz: 9c515f579e66429e8c6c45cbc3f9dcd215b26d39
4
+ data.tar.gz: 23f075c1c83004cf9272b7cd8949da16c18ba169
5
5
  SHA512:
6
- metadata.gz: de77d585a2475cf9c47f8e28b32b2217188370298329d3db7fd91ab0fb577fd1cdc74e2f5defaf8cfc375f6db6e9513fa4d4eb05c4765135c870c595c0f8fc87
7
- data.tar.gz: 3175e85b544f41deaf1c10924bc39e4606bde5fde11fd8ea039b6bd9958be551f56539dad4a7ce4f8d26a638e4e461a2479a391f356372c5c3494c926680ae81
6
+ metadata.gz: 609a092cb19169ab3f09589812b7454bcd32f8ac379ce99d4fad2c8eab01dccabbfc65176ea38785212d7f14e7c4a8ecc52fc8a053cfcec2a4d77e424c7c686e
7
+ data.tar.gz: 9cb39dbf8341c7973ab53c2659c58c344025b7f8c338c290fc8cf68fc7914b5c6a751c504e60d9a5127944c51614dfc218728dc0ce31f19c9db09f3c308c6a85
@@ -118,7 +118,7 @@ module Arsenicum
118
118
  end
119
119
 
120
120
  def build
121
- klass.new(name, init_parameters.merge(router_class: router_class)).tap do |queue|
121
+ klass.new(name, init_parameters.merge(worker_count: worker_count, router_class: router_class)).tap do |queue|
122
122
  task_configurations.each do |task_config|
123
123
  queue.register task_config.build
124
124
  end
@@ -11,7 +11,6 @@ class Arsenicum::Core::Broker
11
11
 
12
12
  def initialize(options = {})
13
13
  @worker_count = (options.delete(:worker_count) || PROCESSOR_COUNT_DEFAULT).to_i
14
- @mutex = Mutex.new
15
14
  @tasks = {}
16
15
  @router = options.delete :router
17
16
 
@@ -19,6 +18,8 @@ class Arsenicum::Core::Broker
19
18
  formatter = options[:formatter] || Arsenicum::Formatter.new
20
19
  @worker_options = options.delete(:worker_options) || {}
21
20
  @worker_options.merge! serializer: serializer, formatter: formatter
21
+ @current_worker_index = -1 # because it is incremented whenever used. (primary index should be ZERO)
22
+ @mutex = Mutex.new
22
23
  end
23
24
 
24
25
  def [](task_id)
@@ -32,8 +33,8 @@ class Arsenicum::Core::Broker
32
33
  alias_method :register, :[]=
33
34
 
34
35
  def run
35
- @workers = {}
36
- @available_workers = {}
36
+ @workers = []
37
+ @available_workers = []
37
38
 
38
39
  prepare_workers
39
40
  end
@@ -56,63 +57,56 @@ class Arsenicum::Core::Broker
56
57
  end
57
58
 
58
59
  def stop
59
- workers.values.map(&:stop)
60
+ workers.each(&:stop)
60
61
  end
61
62
 
62
63
  def remove(worker)
63
- mutex.synchronize do
64
- workers.delete(worker.pid)
65
- available_workers.delete(worker.pid)
66
- end
64
+ available_workers.delete(worker)
65
+ workers.delete(worker)
67
66
  end
68
67
 
69
68
  def reload
70
- workers.values.each(&:stop)
69
+ stop
71
70
 
72
- workers.clear
73
71
  available_workers.clear
72
+ workers.clear
74
73
 
75
74
  prepare_workers
76
75
  end
77
76
 
78
77
  def get_back_worker(worker)
79
- mutex.synchronize{
80
- if worker.active?
81
- available_workers[worker.pid] = worker
82
- else
83
- next_index = workers.count
84
- remove worker
85
- worker.stop
86
- prepare_worker next_index
87
- end
88
- }
78
+ if worker.active?
79
+ available_workers << worker
80
+ else
81
+ remove worker
82
+ worker.stop
83
+ prepare_worker
84
+ end
89
85
  end
90
86
 
91
87
  private
92
88
  def prepare_workers
93
- @worker_count.times do |i|
94
- prepare_worker i
95
- end
89
+ @worker_count.times{prepare_worker}
96
90
  end
97
91
 
98
- def prepare_worker index
99
- worker = Arsenicum::Core::Worker.new(self, index, worker_options)
92
+ def prepare_worker
93
+ worker = Arsenicum::Core::Worker.new(self, next_worker_index, worker_options)
100
94
  stock(worker)
101
95
  end
102
96
 
97
+ def next_worker_index
98
+ mutex.synchronize{
99
+ @current_worker_index += 1
100
+ }
101
+ end
102
+
103
103
  def stock(worker)
104
- mutex.synchronize do
105
- pid = worker.run
106
- workers[pid] = worker
107
- available_workers[pid] = worker
108
- end
104
+ workers << worker
105
+ available_workers << worker
109
106
  end
110
107
 
111
108
  def next_worker
112
- mutex.synchronize do
113
- (_, worker) = available_workers.shift
114
- worker
115
- end
109
+ mutex.synchronize{available_workers.shift}
116
110
  end
117
111
 
118
112
  def serialize(value = {})
@@ -27,28 +27,14 @@ class Arsenicum::Core::Worker
27
27
  @thread = InvokerThread.new(self)
28
28
  @work_at = :parent
29
29
  @state = :parent
30
- end
31
-
32
- def run
33
- (@in_parent, @out_child) = open_binary_pipes
34
- (@in_child, @out_parent) = open_binary_pipes
35
- (@ctrl_in_parent, @ctrl_out_child) = open_binary_pipes
36
- (@ctrl_in_child, @ctrl_out_parent) = open_binary_pipes
37
-
38
- @pid = fork &method(:run_in_child)
39
- return unless @pid
40
30
 
41
- @active = true
42
- [in_child, out_child, ctrl_in_child, ctrl_out_child].each(&:close)
43
- pid
31
+ run
44
32
  end
45
33
 
46
- def open_binary_pipes
47
- IO.pipe.each do |io|
48
- io.set_encoding 'BINARY'
49
- end.tap do |pipes|
50
- pipes.last.sync = true
51
- end
34
+ def ==(another)
35
+ return false unless another.is_a? ::Arsenicum::Core::Worker
36
+
37
+ return another.pid == self.pid
52
38
  end
53
39
 
54
40
  def ask(task_id, *parameters)
@@ -70,13 +56,51 @@ class Arsenicum::Core::Worker
70
56
 
71
57
  def stop
72
58
  thread.terminate
73
- return if Process.waitpid pid, Process::WNOHANG
59
+ return unless child_process_alive?
74
60
 
75
61
  write_message ctrl_out_parent, COMMAND_STOP
76
62
  Process.waitpid pid
77
63
  end
78
64
 
65
+ def active?
66
+ worker_thread_alive? && child_process_alive?
67
+ end
68
+
69
+ def return_to_broker
70
+ broker.get_back_worker self
71
+ end
72
+
79
73
  private
74
+ def worker_thread_alive?
75
+ thread.alive?
76
+ end
77
+
78
+ def child_process_alive?
79
+ Process.waitpid pid, Process::WNOHANG
80
+ end
81
+
82
+ def run
83
+ (@in_parent, @out_child) = open_binary_pipes
84
+ (@in_child, @out_parent) = open_binary_pipes
85
+ (@ctrl_in_parent, @ctrl_out_child) = open_binary_pipes
86
+ (@ctrl_in_child, @ctrl_out_parent) = open_binary_pipes
87
+
88
+ @pid = fork &method(:run_in_child)
89
+ return unless @pid
90
+
91
+ @active = true
92
+ [in_child, out_child, ctrl_in_child, ctrl_out_child].each(&:close)
93
+ pid
94
+ end
95
+
96
+ def open_binary_pipes
97
+ IO.pipe.each do |io|
98
+ io.set_encoding 'BINARY'
99
+ end.tap do |pipes|
100
+ pipes.last.sync = true
101
+ end
102
+ end
103
+
80
104
  def run_in_child
81
105
  switch_state :waiting
82
106
  [in_parent, out_parent, ctrl_in_parent, ctrl_out_parent].each(&:close)
@@ -96,13 +120,6 @@ class Arsenicum::Core::Worker
96
120
  end
97
121
  end
98
122
 
99
- def active?
100
- case state
101
- when :waiting, :busy
102
- true
103
- end
104
- end
105
-
106
123
  def switch_state(state)
107
124
  @state = state
108
125
  $0 = process_name
@@ -180,10 +197,6 @@ class Arsenicum::Core::Worker
180
197
  "arsenicum[Worker ##{index}] - #{state}"
181
198
  end
182
199
 
183
- def return_to_broker
184
- broker.get_back_worker self
185
- end
186
-
187
200
  [:debug, :info, :warn, :error, :fatal].each do |level|
188
201
  eval <<-SCRIPT, binding, __FILE__, __LINE__ + 1
189
202
  def #{level}(message: nil, exception: nil)
@@ -238,7 +251,7 @@ class Arsenicum::Core::Worker
238
251
  failure_handler.call e
239
252
  ensure
240
253
  self.task_request = nil
241
- return_to_broker
254
+ worker.return_to_broker
242
255
  end
243
256
  end
244
257
  end
@@ -4,8 +4,8 @@ module Arsenicum::Logger
4
4
  class << self
5
5
  attr_reader :logger
6
6
 
7
- def configure(logger_config)
8
- @logger = logger_config.build
7
+ def set_logger(logger)
8
+ @logger = logger
9
9
  end
10
10
 
11
11
  [:debug, :info, :warn, :error, :fatal].each do |method|
@@ -47,7 +47,7 @@ module Arsenicum
47
47
  def before_boot(config);end
48
48
 
49
49
  def configure_log(config)
50
- Arsenicum::Logger.configure config.logger_config
50
+ Arsenicum::Logger.set_logger config.logger_config.build
51
51
  end
52
52
 
53
53
  def trap_signal
@@ -25,8 +25,12 @@ class Arsenicum::Queue
25
25
  next
26
26
  end
27
27
 
28
- next sleep(0.5) unless message
28
+ unless message
29
+ sleep(0.5)
30
+ next
31
+ end
29
32
 
33
+ Arsenicum::Logger.info{"Queue picked. message: #{message.inspect}"}
30
34
  broker.delegate message, -> { handle_success(original_message) }, -> e { handle_failure(e, original_message) }
31
35
  end
32
36
  end
@@ -1,3 +1,3 @@
1
1
  module Arsenicum
2
- VERSION = '0.3.1.2'
2
+ VERSION = '0.4'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arsenicum
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1.2
4
+ version: '0.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - condor