resque-multi-job-forks 0.1.2 → 0.2.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/README.rdoc +3 -3
- data/Rakefile +2 -2
- data/lib/resque-multi-job-forks.rb +17 -7
- data/test/test_resque-multi-job-forks.rb +5 -2
- metadata +3 -10
data/README.rdoc
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
If you have very frequent and fast resque jobs, the overhead of forking and running your after_fork hook, might get too big. Using this resque plugin, you can have your workers perform more than one job, before terminating.
|
4
4
|
|
5
|
-
You
|
5
|
+
You simply specify the number of minutes you want each fork to run using the MINUTES_PER_FORK environment variable:
|
6
6
|
|
7
|
-
QUEUE=*
|
7
|
+
QUEUE=* MINUTES_PER_FORK=5 rake resque:work
|
8
8
|
|
9
|
-
This will have each fork process
|
9
|
+
This will have each fork process jobs for 5 minutes, before terminating.
|
10
10
|
|
11
11
|
This plugin also defines a new hook, that gets called right before the fork terminates:
|
12
12
|
|
data/Rakefile
CHANGED
@@ -5,14 +5,14 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "resque-multi-job-forks"
|
8
|
-
gem.version = "0.
|
8
|
+
gem.version = "0.2.0"
|
9
9
|
gem.summary = %Q{Have your resque workers process more that one job}
|
10
10
|
gem.description = %Q{When your resque jobs are frequent and fast,
|
11
11
|
the overhead of forking and running your after_fork might get too big.}
|
12
12
|
gem.email = "mick@staugaard.com"
|
13
13
|
gem.homepage = "http://github.com/staugaard/resque-multi-job-forks"
|
14
14
|
gem.authors = ["Mick Staugaard"]
|
15
|
-
gem.add_dependency "resque", "
|
15
|
+
gem.add_dependency "resque", "< 1.8.0"
|
16
16
|
end
|
17
17
|
Jeweler::GemcutterTasks.new
|
18
18
|
rescue LoadError
|
@@ -21,26 +21,36 @@ module Resque
|
|
21
21
|
attr_reader :jobs_processed
|
22
22
|
|
23
23
|
unless method_defined?(:done_working_without_multi_job_forks)
|
24
|
+
def process_with_multi_job_forks(job = nil)
|
25
|
+
@jobs_processed ||= 0
|
26
|
+
@kill_fork_at ||= Time.now.to_i + (ENV['MINUTES_PER_FORK'].to_i * 60)
|
27
|
+
process_without_multi_job_forks(job)
|
28
|
+
end
|
29
|
+
alias_method :process_without_multi_job_forks, :process
|
30
|
+
alias_method :process, :process_with_multi_job_forks
|
31
|
+
|
24
32
|
def done_working_with_multi_job_forks
|
25
33
|
done_working_without_multi_job_forks
|
26
34
|
|
27
|
-
self.jobs_per_fork ||= [ ENV['JOBS_PER_FORK'].to_i, 1 ].max
|
28
|
-
@jobs_processed ||= 0
|
29
|
-
|
30
35
|
@jobs_processed += 1
|
31
36
|
|
32
37
|
if @jobs_processed == 1
|
33
38
|
old_after_fork = Resque.after_fork
|
34
39
|
Resque.after_fork = nil
|
35
|
-
|
36
|
-
while
|
37
|
-
|
40
|
+
|
41
|
+
while Time.now.to_i < @kill_fork_at
|
42
|
+
if job = reserve
|
43
|
+
process(job)
|
44
|
+
else
|
45
|
+
sleep(1)
|
46
|
+
end
|
38
47
|
end
|
39
48
|
|
40
49
|
Resque.after_fork = old_after_fork
|
41
50
|
|
42
51
|
run_hook :before_child_exit, self
|
43
|
-
@jobs_processed =
|
52
|
+
@jobs_processed = nil
|
53
|
+
@kill_fork_at = nil
|
44
54
|
end
|
45
55
|
end
|
46
56
|
alias_method :done_working_without_multi_job_forks, :done_working
|
@@ -3,6 +3,8 @@ require 'helper'
|
|
3
3
|
class SomeJob
|
4
4
|
def self.perform(i)
|
5
5
|
$SEQUENCE << "work_#{i}".to_sym
|
6
|
+
puts 'working...'
|
7
|
+
sleep(25)
|
6
8
|
end
|
7
9
|
end
|
8
10
|
|
@@ -22,16 +24,17 @@ class TestResqueMultiJobForks < Test::Unit::TestCase
|
|
22
24
|
def test_sequence_of_events
|
23
25
|
Resque.redis.flush_all
|
24
26
|
|
25
|
-
ENV['
|
27
|
+
ENV['MINUTES_PER_FORK'] = '1'
|
26
28
|
|
27
29
|
worker = Resque::Worker.new(:jobs)
|
28
30
|
|
29
31
|
Resque::Job.create(:jobs, SomeJob, 1)
|
30
32
|
Resque::Job.create(:jobs, SomeJob, 2)
|
31
33
|
Resque::Job.create(:jobs, SomeJob, 3)
|
34
|
+
Resque::Job.create(:jobs, SomeJob, 4)
|
32
35
|
|
33
36
|
worker.work(0)
|
34
37
|
|
35
|
-
assert_equal([:after_fork, :work_1, :work_2, :
|
38
|
+
assert_equal([:after_fork, :work_1, :work_2, :work_3, :before_child_exit_3, :after_fork, :work_4, :before_child_exit_1], $SEQUENCE)
|
36
39
|
end
|
37
40
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
- 1
|
8
7
|
- 2
|
9
|
-
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Mick Staugaard
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-22 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -22,13 +22,6 @@ dependencies:
|
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - ">="
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 1
|
29
|
-
- 6
|
30
|
-
- 0
|
31
|
-
version: 1.6.0
|
32
25
|
- - <
|
33
26
|
- !ruby/object:Gem::Version
|
34
27
|
segments:
|