delayed_job_worker_pool 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +8 -0
- data/.travis.yml +9 -4
- data/CHANGELOG.md +7 -1
- data/Gemfile +2 -0
- data/README.md +28 -6
- data/Rakefile +2 -0
- data/bin/delayed_job_worker_pool +1 -0
- data/delayed_job_worker_pool.gemspec +8 -5
- data/lib/delayed_job_worker_pool.rb +4 -0
- data/lib/delayed_job_worker_pool/application.rb +3 -1
- data/lib/delayed_job_worker_pool/dsl.rb +24 -6
- data/lib/delayed_job_worker_pool/registry.rb +63 -0
- data/lib/delayed_job_worker_pool/version.rb +3 -1
- data/lib/delayed_job_worker_pool/worker.rb +2 -0
- data/lib/delayed_job_worker_pool/worker_group_options.rb +17 -0
- data/lib/delayed_job_worker_pool/worker_info.rb +4 -2
- data/lib/delayed_job_worker_pool/worker_pool.rb +58 -37
- metadata +58 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a0273d86b923b9ab445381d365eb26bce6253433bee7a8a8ad8882846ab5626f
|
4
|
+
data.tar.gz: 8b0db9639c8d1107f4eda74accc59253b9e2e55ffdcbbae167324a895d6c7bc9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed7f9139bdaebf583aa2bae0420f253a88c759d2bda97b4cfd88c5f11f77ec08361f9ddb866ad32bc66569848d8ba41b5629531b2a02e123a60eec86fbbd3435
|
7
|
+
data.tar.gz: e0974480bd81a01d60e48ac5db9a2f4cc29d6ad62b0c8af9e426b2c4da28fc950b8e408aa9f20a948c7eb2fb9130e5d2db13a9b0a8f6c27a1e85314091f4ab83
|
data/.rubocop.yml
ADDED
data/.travis.yml
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
sudo: false
|
2
4
|
rvm:
|
3
|
-
- 2.
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
before_install: gem install bundler -v 1
|
5
|
+
- 2.7.1
|
6
|
+
- 2.6.6
|
7
|
+
- 2.5.8
|
8
|
+
before_install: gem install bundler -v '~> 2.1'
|
9
|
+
script:
|
10
|
+
- bundle exec rspec
|
11
|
+
- bundle exec rubocop
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
### 0.
|
3
|
+
### 0.3.0
|
4
|
+
* Require Ruby 2.5 or higher.
|
5
|
+
* Support for running multiple worker pools on a single node.
|
6
|
+
See [#7](https://github.com/salsify/delayed_job_worker_pool/pull/7) for details.
|
7
|
+
Thanks to Severin Räz!
|
8
|
+
|
9
|
+
### 0.2.3
|
4
10
|
* Explicitly require 'fcntl' to fix uninitialized constant IO::Fcntl. Thanks to Stefan Wrobel!
|
5
11
|
|
6
12
|
### 0.2.2
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -41,9 +41,11 @@ delayed_job_worker_pool
|
|
41
41
|
The config file is a Ruby DSL inspired by the [Puma](https://github.com/puma/puma) configuration DSL. Here's an example:
|
42
42
|
|
43
43
|
```ruby
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
worker_group do |g|
|
45
|
+
g.workers = Integer(ENV['NUM_WORKERS'] || 1)
|
46
|
+
g.queues = (ENV['QUEUES'] || ENV['QUEUE'] || '').split(',')
|
47
|
+
g.sleep_delay = ENV['WORKER_SLEEP_DELAY']
|
48
|
+
end
|
47
49
|
|
48
50
|
preload_app
|
49
51
|
|
@@ -77,10 +79,26 @@ after_worker_shutdown do |worker_info|
|
|
77
79
|
end
|
78
80
|
```
|
79
81
|
|
82
|
+
You can configure multiple worker groups, i.e.:
|
83
|
+
|
84
|
+
```
|
85
|
+
worker_group(:default) do |g|
|
86
|
+
g.workers = 1
|
87
|
+
g.queues = ['default']
|
88
|
+
end
|
89
|
+
|
90
|
+
worker_group(:mails) do |g|
|
91
|
+
g.workers = 1
|
92
|
+
g.queues = ['mail]
|
93
|
+
end
|
94
|
+
|
95
|
+
```
|
96
|
+
|
80
97
|
Here's more information on each setting:
|
81
98
|
|
82
|
-
* `
|
83
|
-
*
|
99
|
+
* `worker_group` - You need at least one worker group. Group settings can be set as illustrated above. Worker group settings:
|
100
|
+
* `workers` - The number of Delayed Job worker processes to fork. The master process will relaunch workers that fail.
|
101
|
+
* Delayed Job worker settings (`queues`, `min_priority`, `max_priority`, `sleep_delay`, `read_ahead`) - These are passed through to the Delayed Job worker.
|
84
102
|
* `preload_app` - This forces the master process to load Rails before forking worker processes causing the memory consumed by the code to be shared between workers. **If you use this setting make sure you re-establish any necessary connections in the on_worker_boot callback.**
|
85
103
|
* `after_preload_app` - A callback that runs in the master process after preloading the app but before forking any workers.
|
86
104
|
* `on_worker_boot` - A callback that runs in the worker process after it has been forked.
|
@@ -89,11 +107,15 @@ Here's more information on each setting:
|
|
89
107
|
|
90
108
|
All settings are optional and nil values are ignored.
|
91
109
|
|
110
|
+
## Upgrading from v0.2.x
|
111
|
+
|
112
|
+
* Convert your worker settings to a single worker group (see _Usage_)
|
113
|
+
* Please note the delayed job worker names changed to include ` group: <group_name>`, e.g. if you are monitoring them by their name
|
114
|
+
|
92
115
|
## Contributing
|
93
116
|
|
94
117
|
Bug reports and pull requests are welcome on GitHub at https://github.com/salsify/delayed_job_worker_pool.
|
95
118
|
|
96
|
-
|
97
119
|
## License
|
98
120
|
|
99
121
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
data/bin/delayed_job_worker_pool
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'delayed_job_worker_pool/version'
|
5
6
|
|
@@ -17,14 +18,16 @@ Gem::Specification.new do |spec|
|
|
17
18
|
spec.executables = ['delayed_job_worker_pool']
|
18
19
|
spec.require_paths = ['lib']
|
19
20
|
|
20
|
-
spec.required_ruby_version = '>= 2.
|
21
|
+
spec.required_ruby_version = '>= 2.5'
|
21
22
|
|
22
23
|
spec.add_dependency 'delayed_job', ['>= 3.0', '< 4.2']
|
23
24
|
|
25
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
24
26
|
spec.add_development_dependency 'delayed_job_active_record'
|
25
|
-
spec.add_development_dependency '
|
27
|
+
spec.add_development_dependency 'rails', '>= 4.2', '< 6'
|
26
28
|
spec.add_development_dependency 'rake', '~> 10.0'
|
27
29
|
spec.add_development_dependency 'rspec', '>= 3.3'
|
30
|
+
spec.add_development_dependency 'salsify_rubocop', '0.85.0'
|
31
|
+
spec.add_development_dependency 'sprockets', '< 4'
|
28
32
|
spec.add_development_dependency 'sqlite3', '>= 1.3'
|
29
|
-
spec.add_development_dependency 'rails', '>= 4.2'
|
30
33
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'delayed_job_worker_pool/application'
|
2
4
|
require 'delayed_job_worker_pool/dsl'
|
5
|
+
require 'delayed_job_worker_pool/registry'
|
3
6
|
require 'delayed_job_worker_pool/worker'
|
4
7
|
require 'delayed_job_worker_pool/worker_info'
|
5
8
|
require 'delayed_job_worker_pool/worker_pool'
|
9
|
+
require 'delayed_job_worker_pool/worker_group_options'
|
6
10
|
require 'delayed_job_worker_pool/version'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DelayedJobWorkerPool
|
2
4
|
module Application
|
3
5
|
extend self
|
@@ -6,7 +8,7 @@ module DelayedJobWorkerPool
|
|
6
8
|
require(base_application_filename)
|
7
9
|
rescue LoadError
|
8
10
|
raise "Could not find Rails initialization file #{full_application_filename}. " \
|
9
|
-
|
11
|
+
'Make sure delayed_job_worker_pool is run from the Rails root directory.'
|
10
12
|
end
|
11
13
|
|
12
14
|
private
|
@@ -1,29 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DelayedJobWorkerPool
|
2
4
|
class DSL
|
3
|
-
|
5
|
+
class NoWorkerGroupsDefined < StandardError; end
|
6
|
+
class NonUniqueGroupName < StandardError; end
|
7
|
+
|
4
8
|
CALLBACK_SETTINGS = [:after_preload_app, :on_worker_boot, :after_worker_boot, :after_worker_shutdown].freeze
|
9
|
+
DEFAULT_WORKER_GROUP_NAME = :default
|
5
10
|
|
6
11
|
def self.load(path)
|
7
12
|
options = {}
|
8
13
|
|
9
14
|
dsl = new(options)
|
10
15
|
dsl.instance_eval(File.read(path), path, 1)
|
16
|
+
dsl.assert_groups_defined!
|
11
17
|
|
12
18
|
options
|
13
19
|
end
|
14
20
|
|
15
21
|
def initialize(options)
|
16
22
|
@options = options
|
23
|
+
@options[:worker_groups] ||= {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def preload_app(preload = true)
|
27
|
+
@options[:preload_app] = preload
|
17
28
|
end
|
18
29
|
|
19
|
-
|
20
|
-
|
21
|
-
|
30
|
+
def worker_group(name = DEFAULT_WORKER_GROUP_NAME)
|
31
|
+
name_sym = name.to_sym
|
32
|
+
if @options[:worker_groups].key?(name_sym)
|
33
|
+
raise NonUniqueGroupName.new("Worker group name #{name_sym} is already in use")
|
22
34
|
end
|
35
|
+
|
36
|
+
group_options = WorkerGroupOptions.new
|
37
|
+
yield(group_options)
|
38
|
+
@options[:worker_groups][name_sym] = group_options
|
23
39
|
end
|
24
40
|
|
25
|
-
def
|
26
|
-
@options[:
|
41
|
+
def assert_groups_defined!
|
42
|
+
return unless @options[:worker_groups].empty?
|
43
|
+
|
44
|
+
raise NoWorkerGroupsDefined.new('No worker groups defined. Define groups using `worker_group`.')
|
27
45
|
end
|
28
46
|
|
29
47
|
CALLBACK_SETTINGS.each do |option_name|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DelayedJobWorkerPool
|
4
|
+
# Keeps track of worker groups and their workers.
|
5
|
+
class Registry
|
6
|
+
class GroupAlreadyExists < StandardError; end
|
7
|
+
class GroupDoesNotExist < StandardError; end
|
8
|
+
class GroupNotFound < StandardError; end
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@groups = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def include_worker?(pid)
|
15
|
+
worker_pids.include?(pid)
|
16
|
+
end
|
17
|
+
|
18
|
+
def workers?
|
19
|
+
!worker_pids.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_group(name, options)
|
23
|
+
raise GroupAlreadyExists.new("Group #{group} already exists") if @groups.key?(name)
|
24
|
+
|
25
|
+
@groups[name] = {
|
26
|
+
options: options,
|
27
|
+
pids: []
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_worker(group_name, pid)
|
32
|
+
group_by_name(group_name)[:pids] << pid
|
33
|
+
end
|
34
|
+
|
35
|
+
def remove_worker(pid)
|
36
|
+
@groups[group(pid)][:pids].delete(pid)
|
37
|
+
end
|
38
|
+
|
39
|
+
def options(group_name)
|
40
|
+
group_by_name(group_name)[:options]
|
41
|
+
end
|
42
|
+
|
43
|
+
def worker_pids
|
44
|
+
@groups.values.flat_map { |v| v[:pids] }
|
45
|
+
end
|
46
|
+
|
47
|
+
def group(pid)
|
48
|
+
@groups.each do |name, group|
|
49
|
+
return name if group[:pids].include?(pid)
|
50
|
+
end
|
51
|
+
raise GroupNotFound.new("No group found for PID #{pid}")
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def group_by_name(name)
|
57
|
+
match = @groups[name]
|
58
|
+
return match unless match.nil?
|
59
|
+
|
60
|
+
raise GroupDoesNotExist.new("No group with name #{name.inspect} found")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DelayedJobWorkerPool
|
4
|
+
class WorkerGroupOptions
|
5
|
+
DJ_SETTINGS = [:queues, :min_priority, :max_priority, :sleep_delay, :read_ahead].freeze
|
6
|
+
GROUP_SETTINGS = [:workers].freeze
|
7
|
+
|
8
|
+
attr_accessor *DJ_SETTINGS, *GROUP_SETTINGS
|
9
|
+
|
10
|
+
# @return an options hash for `Delayed::Worker`
|
11
|
+
def dj_worker_options
|
12
|
+
DJ_SETTINGS.each_with_object({}) do |setting, memo|
|
13
|
+
memo[setting] = send(setting)
|
14
|
+
end.compact
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module DelayedJobWorkerPool
|
2
4
|
class WorkerInfo
|
3
|
-
attr_reader :process_id, :name
|
5
|
+
attr_reader :process_id, :name, :worker_group
|
4
6
|
|
5
7
|
def initialize(attributes)
|
6
8
|
@process_id = attributes.fetch(:process_id)
|
7
9
|
@name = attributes.fetch(:name)
|
10
|
+
@worker_group = attributes.fetch(:worker_group)
|
8
11
|
end
|
9
|
-
|
10
12
|
end
|
11
13
|
end
|
@@ -1,12 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fcntl'
|
4
|
+
require 'socket'
|
2
5
|
|
3
6
|
module DelayedJobWorkerPool
|
4
7
|
class WorkerPool
|
8
|
+
|
5
9
|
SIGNALS = ['TERM', 'INT'].map(&:freeze).freeze
|
10
|
+
DEFAULT_WORKER_COUNT = 1
|
6
11
|
|
7
12
|
def initialize(options = {})
|
8
13
|
@options = options
|
9
|
-
@
|
14
|
+
@registry = Registry.new
|
10
15
|
@pending_signals = []
|
11
16
|
@pending_signal_read_pipe, @pending_signal_write_pipe = create_pipe(inheritable: false)
|
12
17
|
@master_alive_read_pipe, @master_alive_write_pipe = create_pipe(inheritable: true)
|
@@ -25,7 +30,7 @@ module DelayedJobWorkerPool
|
|
25
30
|
|
26
31
|
log_uninheritable_threads
|
27
32
|
|
28
|
-
|
33
|
+
fork_workers
|
29
34
|
|
30
35
|
monitor_workers
|
31
36
|
|
@@ -37,7 +42,7 @@ module DelayedJobWorkerPool
|
|
37
42
|
|
38
43
|
private
|
39
44
|
|
40
|
-
attr_reader :options, :
|
45
|
+
attr_reader :options, :registry, :master_alive_read_pipe, :master_alive_write_pipe,
|
41
46
|
:pending_signals, :pending_signal_read_pipe, :pending_signal_write_pipe
|
42
47
|
attr_accessor :shutting_down
|
43
48
|
|
@@ -59,8 +64,10 @@ module DelayedJobWorkerPool
|
|
59
64
|
def log_uninheritable_threads
|
60
65
|
Thread.list.each do |t|
|
61
66
|
next if t == Thread.current
|
67
|
+
|
62
68
|
if t.respond_to?(:backtrace)
|
63
|
-
log("WARNING: Thread will not be inherited by workers: #{t.inspect} -
|
69
|
+
log("WARNING: Thread will not be inherited by workers: #{t.inspect} - " \
|
70
|
+
"#{t.backtrace ? t.backtrace.first : ''}")
|
64
71
|
else
|
65
72
|
log("WARNING: Thread will not be inherited by workers: #{t.inspect}")
|
66
73
|
end
|
@@ -74,15 +81,16 @@ module DelayedJobWorkerPool
|
|
74
81
|
def shutdown(signal)
|
75
82
|
log("Shutting down master #{Process.pid} with signal #{signal}")
|
76
83
|
self.shutting_down = true
|
77
|
-
worker_pids.each do |child_pid|
|
78
|
-
|
84
|
+
registry.worker_pids.each do |child_pid|
|
85
|
+
group = registry.group(child_pid)
|
86
|
+
log("Telling worker #{child_pid} from group #{group} to shutdown with signal #{signal}")
|
79
87
|
Process.kill(signal, child_pid)
|
80
88
|
end
|
81
89
|
end
|
82
90
|
|
83
91
|
def monitor_workers
|
84
|
-
while
|
85
|
-
if
|
92
|
+
while workers?
|
93
|
+
if pending_signal?
|
86
94
|
shutdown(pending_signals.pop)
|
87
95
|
elsif (wait_result = Process.wait2(-1, Process::WNOHANG))
|
88
96
|
handle_dead_worker(wait_result.first, wait_result.last)
|
@@ -93,19 +101,22 @@ module DelayedJobWorkerPool
|
|
93
101
|
end
|
94
102
|
|
95
103
|
def handle_dead_worker(worker_pid, status)
|
96
|
-
return unless
|
104
|
+
return unless registry.include_worker?(worker_pid)
|
97
105
|
|
98
106
|
log("Worker #{worker_pid} exited with status #{status.to_i}")
|
99
|
-
|
100
|
-
|
101
|
-
|
107
|
+
|
108
|
+
group = registry.group(worker_pid)
|
109
|
+
invoke_callback(:after_worker_shutdown, worker_info(worker_pid, group))
|
110
|
+
|
111
|
+
registry.remove_worker(worker_pid)
|
112
|
+
fork_worker(group) unless shutting_down
|
102
113
|
end
|
103
114
|
|
104
|
-
def
|
105
|
-
|
115
|
+
def workers?
|
116
|
+
registry.workers?
|
106
117
|
end
|
107
118
|
|
108
|
-
def
|
119
|
+
def pending_signal?
|
109
120
|
!pending_signals.empty?
|
110
121
|
end
|
111
122
|
|
@@ -113,14 +124,26 @@ module DelayedJobWorkerPool
|
|
113
124
|
options[callback_name].call(*args) if options[callback_name]
|
114
125
|
end
|
115
126
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
127
|
+
def fork_workers
|
128
|
+
options.fetch(:worker_groups).each do |name, group|
|
129
|
+
workers = group.workers || DEFAULT_WORKER_COUNT
|
130
|
+
|
131
|
+
registry.add_group(name, group.dj_worker_options)
|
132
|
+
|
133
|
+
workers.times { fork_worker(name) }
|
134
|
+
end
|
121
135
|
end
|
122
136
|
|
123
|
-
def
|
137
|
+
def fork_worker(group)
|
138
|
+
worker_pid = Kernel.fork { run_worker(group) }
|
139
|
+
log("Started worker in group #{group}: #{worker_pid}")
|
140
|
+
|
141
|
+
registry.add_worker(group, worker_pid)
|
142
|
+
|
143
|
+
invoke_callback(:after_worker_boot, worker_info(worker_pid, group))
|
144
|
+
end
|
145
|
+
|
146
|
+
def run_worker(group)
|
124
147
|
master_alive_write_pipe.close
|
125
148
|
|
126
149
|
uninstall_signal_handlers
|
@@ -133,32 +156,32 @@ module DelayedJobWorkerPool
|
|
133
156
|
|
134
157
|
load_app unless preload_app?
|
135
158
|
|
136
|
-
invoke_callback(:on_worker_boot, worker_info(Process.pid))
|
159
|
+
invoke_callback(:on_worker_boot, worker_info(Process.pid, group))
|
137
160
|
|
138
|
-
DelayedJobWorkerPool::Worker.run(worker_options(Process.pid))
|
139
|
-
rescue => e
|
161
|
+
DelayedJobWorkerPool::Worker.run(worker_options(Process.pid, group))
|
162
|
+
rescue StandardError => e
|
140
163
|
log("Worker failed with error: #{e.message}\n#{e.backtrace.join("\n")}")
|
141
164
|
exit(1)
|
142
165
|
end
|
143
166
|
|
144
|
-
def worker_info(worker_pid)
|
145
|
-
DelayedJobWorkerPool::WorkerInfo.new(
|
167
|
+
def worker_info(worker_pid, group)
|
168
|
+
DelayedJobWorkerPool::WorkerInfo.new(
|
169
|
+
name: worker_name(worker_pid, group),
|
170
|
+
process_id: worker_pid,
|
171
|
+
worker_group: group
|
172
|
+
)
|
146
173
|
end
|
147
174
|
|
148
|
-
def worker_name(worker_pid)
|
149
|
-
"host:#{Socket.gethostname} pid:#{worker_pid}"
|
150
|
-
end
|
151
|
-
|
152
|
-
def num_workers
|
153
|
-
options.fetch(:workers, 1)
|
175
|
+
def worker_name(worker_pid, group)
|
176
|
+
"host:#{Socket.gethostname} pid:#{worker_pid} group:#{group}"
|
154
177
|
end
|
155
178
|
|
156
179
|
def preload_app?
|
157
180
|
options.fetch(:preload_app, false)
|
158
181
|
end
|
159
182
|
|
160
|
-
def worker_options(worker_pid)
|
161
|
-
options
|
183
|
+
def worker_options(worker_pid, group)
|
184
|
+
registry.options(group).merge(name: worker_name(worker_pid, group))
|
162
185
|
end
|
163
186
|
|
164
187
|
def create_pipe(inheritable: true)
|
@@ -175,9 +198,7 @@ module DelayedJobWorkerPool
|
|
175
198
|
end
|
176
199
|
|
177
200
|
def wait_for_signal(timeout)
|
178
|
-
if IO.select([pending_signal_read_pipe], [], [], timeout)
|
179
|
-
drain_pipe(pending_signal_read_pipe)
|
180
|
-
end
|
201
|
+
drain_pipe(pending_signal_read_pipe) if IO.select([pending_signal_read_pipe], [], [], timeout)
|
181
202
|
end
|
182
203
|
|
183
204
|
def drain_pipe(pipe)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_worker_pool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Turkel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: delayed_job
|
@@ -30,6 +30,20 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '4.2'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bundler
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.1'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.1'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: delayed_job_active_record
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,19 +59,25 @@ dependencies:
|
|
45
59
|
- !ruby/object:Gem::Version
|
46
60
|
version: '0'
|
47
61
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
62
|
+
name: rails
|
49
63
|
requirement: !ruby/object:Gem::Requirement
|
50
64
|
requirements:
|
51
|
-
- - "
|
65
|
+
- - ">="
|
52
66
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
67
|
+
version: '4.2'
|
68
|
+
- - "<"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '6'
|
54
71
|
type: :development
|
55
72
|
prerelease: false
|
56
73
|
version_requirements: !ruby/object:Gem::Requirement
|
57
74
|
requirements:
|
58
|
-
- - "
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '4.2'
|
78
|
+
- - "<"
|
59
79
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
80
|
+
version: '6'
|
61
81
|
- !ruby/object:Gem::Dependency
|
62
82
|
name: rake
|
63
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,34 +107,48 @@ dependencies:
|
|
87
107
|
- !ruby/object:Gem::Version
|
88
108
|
version: '3.3'
|
89
109
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
110
|
+
name: salsify_rubocop
|
91
111
|
requirement: !ruby/object:Gem::Requirement
|
92
112
|
requirements:
|
93
|
-
- -
|
113
|
+
- - '='
|
94
114
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
115
|
+
version: 0.85.0
|
96
116
|
type: :development
|
97
117
|
prerelease: false
|
98
118
|
version_requirements: !ruby/object:Gem::Requirement
|
99
119
|
requirements:
|
100
|
-
- -
|
120
|
+
- - '='
|
101
121
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
122
|
+
version: 0.85.0
|
103
123
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
124
|
+
name: sprockets
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "<"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '4'
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "<"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '4'
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: sqlite3
|
105
139
|
requirement: !ruby/object:Gem::Requirement
|
106
140
|
requirements:
|
107
141
|
- - ">="
|
108
142
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
143
|
+
version: '1.3'
|
110
144
|
type: :development
|
111
145
|
prerelease: false
|
112
146
|
version_requirements: !ruby/object:Gem::Requirement
|
113
147
|
requirements:
|
114
148
|
- - ">="
|
115
149
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
117
|
-
description:
|
150
|
+
version: '1.3'
|
151
|
+
description:
|
118
152
|
email:
|
119
153
|
- jturkel@salsify.com
|
120
154
|
executables:
|
@@ -123,6 +157,7 @@ extensions: []
|
|
123
157
|
extra_rdoc_files: []
|
124
158
|
files:
|
125
159
|
- ".gitignore"
|
160
|
+
- ".rubocop.yml"
|
126
161
|
- ".travis.yml"
|
127
162
|
- CHANGELOG.md
|
128
163
|
- Gemfile
|
@@ -134,15 +169,17 @@ files:
|
|
134
169
|
- lib/delayed_job_worker_pool.rb
|
135
170
|
- lib/delayed_job_worker_pool/application.rb
|
136
171
|
- lib/delayed_job_worker_pool/dsl.rb
|
172
|
+
- lib/delayed_job_worker_pool/registry.rb
|
137
173
|
- lib/delayed_job_worker_pool/version.rb
|
138
174
|
- lib/delayed_job_worker_pool/worker.rb
|
175
|
+
- lib/delayed_job_worker_pool/worker_group_options.rb
|
139
176
|
- lib/delayed_job_worker_pool/worker_info.rb
|
140
177
|
- lib/delayed_job_worker_pool/worker_pool.rb
|
141
178
|
homepage: https://github.com/salsify/delayed_job_worker_pool
|
142
179
|
licenses:
|
143
180
|
- MIT
|
144
181
|
metadata: {}
|
145
|
-
post_install_message:
|
182
|
+
post_install_message:
|
146
183
|
rdoc_options: []
|
147
184
|
require_paths:
|
148
185
|
- lib
|
@@ -150,16 +187,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
150
187
|
requirements:
|
151
188
|
- - ">="
|
152
189
|
- !ruby/object:Gem::Version
|
153
|
-
version: '2.
|
190
|
+
version: '2.5'
|
154
191
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
192
|
requirements:
|
156
193
|
- - ">="
|
157
194
|
- !ruby/object:Gem::Version
|
158
195
|
version: '0'
|
159
196
|
requirements: []
|
160
|
-
|
161
|
-
|
162
|
-
signing_key:
|
197
|
+
rubygems_version: 3.0.8
|
198
|
+
signing_key:
|
163
199
|
specification_version: 4
|
164
200
|
summary: Worker process pooling for Delayed Job
|
165
201
|
test_files: []
|