worker 0.3.0 → 0.6.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/examples/args.rb +2 -0
- data/examples/async.rb +34 -0
- data/examples/exception.rb +49 -0
- data/lib/worker.rb +62 -1
- data/worker.gemspec +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ed9501a4b408fdaa2ed8148c365c6b8ddf3c4283cb15d55542eb77604248348
|
4
|
+
data.tar.gz: 666d8b603800b3365d4586b6505fb262bb1a9b02eb8063d37b11f62e8a2a5f99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be216fe2c0cd8161bd59d651fa7a5d68cba397b6d725dc1dd35aec27c01adf7183f888328b114a32af7f5cfeb80f8b2081b9001d92e688ef70e915ccd9eb5a62
|
7
|
+
data.tar.gz: '0925deeae5faf50999ed7337bc440808149c18448ce6da765e0b7404c7b125c3508d92a94c0c049be5b62bcef0e372b863e572f96c615a7d06a40f78d1c1d4b5'
|
data/Gemfile.lock
CHANGED
data/examples/args.rb
CHANGED
data/examples/async.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative "../lib/worker"
|
2
|
+
|
3
|
+
async_adder = Worker.new do |a,b|
|
4
|
+
sleep 0.25
|
5
|
+
a+b
|
6
|
+
end
|
7
|
+
|
8
|
+
async_adder_puts = Worker.new do |a,b|
|
9
|
+
sleep 0.25
|
10
|
+
puts a+b
|
11
|
+
end
|
12
|
+
|
13
|
+
defer = async_adder.perform_async 1, 2
|
14
|
+
print "result is: "
|
15
|
+
puts defer.value
|
16
|
+
|
17
|
+
puts "random order putsing:"
|
18
|
+
5.times do |i|
|
19
|
+
async_adder_puts.perform_async(i, 1)
|
20
|
+
end
|
21
|
+
async_adder_puts.join
|
22
|
+
|
23
|
+
|
24
|
+
no_value = Worker.new do
|
25
|
+
sleep 0.1
|
26
|
+
1
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
defer = no_value.perform_async
|
31
|
+
defer.value!
|
32
|
+
rescue Worker::Defer::ValueError
|
33
|
+
puts "no value"
|
34
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative "../lib/worker"
|
2
|
+
|
3
|
+
raiser = Worker.new do
|
4
|
+
raise "always"
|
5
|
+
end
|
6
|
+
|
7
|
+
begin
|
8
|
+
raiser.perform
|
9
|
+
rescue
|
10
|
+
puts "did raise"
|
11
|
+
end
|
12
|
+
|
13
|
+
did_retry = 0
|
14
|
+
begin
|
15
|
+
retryer = Worker.new retry: 1 do
|
16
|
+
puts "about to raise: #{did_retry}"
|
17
|
+
did_retry += 1
|
18
|
+
raise "always"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
begin
|
23
|
+
retryer.perform
|
24
|
+
rescue
|
25
|
+
end
|
26
|
+
|
27
|
+
puts "---"
|
28
|
+
|
29
|
+
did_retry = 0
|
30
|
+
backoff_retryer = Worker.new retry: 8, backoff: 0.1, backoff_max: 0.5 do
|
31
|
+
puts "about to raise: #{did_retry}"
|
32
|
+
did_retry += 1
|
33
|
+
raise "always"
|
34
|
+
end
|
35
|
+
|
36
|
+
begin
|
37
|
+
backoff_retryer.perform
|
38
|
+
rescue
|
39
|
+
end
|
40
|
+
|
41
|
+
safe_worker = Worker.new retry: 3, raise: false do
|
42
|
+
raise "doesn't matter"
|
43
|
+
ensure
|
44
|
+
puts "I'm safe"
|
45
|
+
end
|
46
|
+
|
47
|
+
safe_worker.perform
|
48
|
+
|
49
|
+
puts "ok"
|
data/lib/worker.rb
CHANGED
@@ -2,12 +2,40 @@ class Worker
|
|
2
2
|
class Ctx
|
3
3
|
end
|
4
4
|
|
5
|
-
|
5
|
+
class Defer
|
6
|
+
class ValueError < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(&block)
|
10
|
+
@value = Queue.new
|
11
|
+
|
12
|
+
Thread.new do
|
13
|
+
@value.push block.call
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def value
|
18
|
+
@value.pop
|
19
|
+
end
|
20
|
+
|
21
|
+
def value!
|
22
|
+
if @value.length == 1
|
23
|
+
value
|
24
|
+
else
|
25
|
+
raise ValueError
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(opts={}, &block)
|
6
31
|
@in = Queue.new
|
7
32
|
@out = Queue.new
|
8
33
|
@block = block
|
9
34
|
@ctx = Worker::Ctx.new
|
35
|
+
@defers = Queue.new
|
10
36
|
|
37
|
+
@retries = 0
|
38
|
+
@opts = opts
|
11
39
|
run!
|
12
40
|
end
|
13
41
|
|
@@ -20,6 +48,39 @@ class Worker
|
|
20
48
|
else
|
21
49
|
ret
|
22
50
|
end
|
51
|
+
rescue Exception => ex
|
52
|
+
backoff = @opts.dig(:backoff) || 0.1
|
53
|
+
backoff_max = @opts.dig(:backoff_max)
|
54
|
+
retries_max = @opts.dig(:retry) || 0
|
55
|
+
|
56
|
+
if @retries == retries_max
|
57
|
+
@retries = 0
|
58
|
+
return if @opts.dig(:raise) == false
|
59
|
+
raise ex
|
60
|
+
end
|
61
|
+
@retries += 1
|
62
|
+
sleeping = @retries * backoff
|
63
|
+
sleeping = backoff_max if backoff_max && sleeping > backoff_max
|
64
|
+
|
65
|
+
sleep sleeping
|
66
|
+
retry
|
67
|
+
end
|
68
|
+
|
69
|
+
def perform_async(*args)
|
70
|
+
defer = Defer.new do
|
71
|
+
ret = perform(*args)
|
72
|
+
@defers.pop
|
73
|
+
ret
|
74
|
+
end
|
75
|
+
@defers.push defer
|
76
|
+
defer
|
77
|
+
end
|
78
|
+
|
79
|
+
def join
|
80
|
+
loop do
|
81
|
+
break if @defers.size == 0
|
82
|
+
sleep 0.1
|
83
|
+
end
|
23
84
|
end
|
24
85
|
|
25
86
|
def run!
|
data/worker.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: worker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matti Paksula
|
@@ -73,6 +73,8 @@ files:
|
|
73
73
|
- bin/setup
|
74
74
|
- examples/adder_memo.rb
|
75
75
|
- examples/args.rb
|
76
|
+
- examples/async.rb
|
77
|
+
- examples/exception.rb
|
76
78
|
- examples/simple.rb
|
77
79
|
- lib/worker.rb
|
78
80
|
- worker.gemspec
|