pwork 1.0.1 → 1.1.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 +5 -5
- data/lib/pwork.rb +3 -2
- data/lib/pwork/async.rb +65 -0
- data/lib/pwork/async/exceptions.rb +2 -0
- data/lib/pwork/async/exceptions/invalid_options.rb +11 -0
- data/lib/pwork/async/exceptions/task_error.rb +11 -0
- data/lib/pwork/async/manager.rb +76 -0
- data/lib/pwork/async/task.rb +17 -0
- metadata +12 -7
- data/lib/pwork/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 249a3ee4b5ad1dd558bcdae10f0309404ec9841693c1f22714904cc8c70f43fb
|
4
|
+
data.tar.gz: 260de7aa9d02fad3f92faf0b00c70bb61689e8a03db64a9bac491c6566b900b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9da793781dfdfa26129d40240783b5c0b7a923ac6ee42297c9632e02308ad5fa5fee4fecb0b5a8ffc887d5df9f76dafe72739cf6ca4eacdae2637af27930024d
|
7
|
+
data.tar.gz: 0833eacb1192ca4fce94848b952aa151f0c92767e077c85573f15c4acc544133c974c6522e8900b82d85c94be170115e9e6dc5e062b8c888147b4016be10fa78
|
data/lib/pwork.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'pwork/version'
|
2
1
|
require_relative 'pwork/helpers/thread'
|
3
2
|
|
4
3
|
require_relative 'pwork/array'
|
@@ -8,4 +7,6 @@ if RUBY_PLATFORM =~ /java/
|
|
8
7
|
require_relative 'pwork/jruby/thread_pool'
|
9
8
|
else
|
10
9
|
require_relative 'pwork/mri/thread_pool'
|
11
|
-
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require_relative 'pwork/async'
|
data/lib/pwork/async.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require_relative 'async/task'
|
2
|
+
require_relative 'async/exceptions'
|
3
|
+
require_relative 'async/manager'
|
4
|
+
|
5
|
+
module PWork
|
6
|
+
module Async
|
7
|
+
def async(options = nil, &block)
|
8
|
+
if block_given?
|
9
|
+
PWork::Async.add_task(options, &block)
|
10
|
+
else
|
11
|
+
raise PWork::Async::Exceptions::InvalidOptionsError.new(
|
12
|
+
'Unknown async option.'
|
13
|
+
) unless options == :wait
|
14
|
+
PWork::Async.wait_for_tasks
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.manager
|
19
|
+
@manager ||= PWork::Async::Manager.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.add_task(options, &block)
|
23
|
+
manager.start unless manager.running
|
24
|
+
|
25
|
+
options = {} if options == nil
|
26
|
+
task = PWork::Async::Task.new.tap do |e|
|
27
|
+
e.block = block
|
28
|
+
end
|
29
|
+
|
30
|
+
unless options[:wait] == false
|
31
|
+
tasks << task
|
32
|
+
end
|
33
|
+
|
34
|
+
manager.add_task(task)
|
35
|
+
|
36
|
+
task.id
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.tasks
|
40
|
+
Thread.current[:pwork_async_tasks] ||= []
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.wait_for_tasks
|
44
|
+
until tasks.detect { |t| t.state == :pending || t.state == :active }.nil?
|
45
|
+
sleep(async_wait_sleep_iteration)
|
46
|
+
end
|
47
|
+
handle_errors
|
48
|
+
ensure
|
49
|
+
Thread.current[:pwork_async_tasks] = []
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.handle_errors
|
53
|
+
error_messages = []
|
54
|
+
tasks.select { |t| t.state == :error }.each do |t|
|
55
|
+
error_messages << "Error: #{t.error.message}, #{t.error.backtrace}"
|
56
|
+
end
|
57
|
+
raise PWork::Async::Exceptions::TaskError.new("1 or more async errors occurred. #{error_messages.join(' | ')}") if error_messages.length > 0
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.async_wait_sleep_iteration
|
62
|
+
Integer(ENV.fetch('PWORK_ASYNC_WAIT_SLEEP_ITERATION', 0.01))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
3
|
+
module PWork
|
4
|
+
module Async
|
5
|
+
class Manager
|
6
|
+
def initialize
|
7
|
+
@queue = Queue.new
|
8
|
+
@threads = []
|
9
|
+
@running = false
|
10
|
+
end
|
11
|
+
|
12
|
+
# This method is called to determine if this manager is running or not
|
13
|
+
def running
|
14
|
+
@running
|
15
|
+
end
|
16
|
+
|
17
|
+
# This method is called to start the async manager
|
18
|
+
def start
|
19
|
+
@running = true
|
20
|
+
pool_size.times do
|
21
|
+
@threads << Thread.new do
|
22
|
+
until @running == false
|
23
|
+
process_task
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# This method is called to stop the async manager
|
30
|
+
def stop
|
31
|
+
@running = false
|
32
|
+
@threads = []
|
33
|
+
end
|
34
|
+
|
35
|
+
# This method is called to determine the size of the async thread pool
|
36
|
+
def pool_size
|
37
|
+
Integer(ENV.fetch('PWORK_ASYNC_POOL_SIZE', 10))
|
38
|
+
end
|
39
|
+
|
40
|
+
# This method is called to process an async task from the queue
|
41
|
+
def process_task
|
42
|
+
task = @queue.pop
|
43
|
+
task.state = :active
|
44
|
+
thread_helper.set_thread_vars(task.thread_local_storage)
|
45
|
+
begin
|
46
|
+
task.block.call
|
47
|
+
task.state = :complete
|
48
|
+
rescue => e
|
49
|
+
task.error = e
|
50
|
+
task.state = :error
|
51
|
+
ensure
|
52
|
+
thread_helper.reset_thread_vars
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# This method is called to expose the thread helper
|
57
|
+
def thread_helper
|
58
|
+
PWork::Helpers::Threads
|
59
|
+
end
|
60
|
+
|
61
|
+
# This method is called to determine the number of tasks in the queue
|
62
|
+
def queue_count
|
63
|
+
@queue.length
|
64
|
+
end
|
65
|
+
|
66
|
+
# This method is called to add a task to the queue
|
67
|
+
def add_task(task)
|
68
|
+
raise PWork::Async::Exceptions::InvalidOptionsError.new(
|
69
|
+
'A valid async task must be specified.'
|
70
|
+
) unless task.is_a?(PWork::Async::Task)
|
71
|
+
task.thread_local_storage = PWork::Helpers::Threads.get_thread_vars
|
72
|
+
@queue.push(task)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
module PWork
|
3
|
+
module Async
|
4
|
+
class Task
|
5
|
+
attr_accessor :id
|
6
|
+
attr_accessor :state
|
7
|
+
attr_accessor :thread_local_storage
|
8
|
+
attr_accessor :error
|
9
|
+
attr_accessor :block
|
10
|
+
def initialize
|
11
|
+
self.id = SecureRandom.uuid
|
12
|
+
self.state = :pending
|
13
|
+
self.thread_local_storage = []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pwork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- vaughanbrittonsage
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -69,7 +69,7 @@ dependencies:
|
|
69
69
|
description: This is a library to facilitate with the execution of work on parallel
|
70
70
|
threads.
|
71
71
|
email:
|
72
|
-
-
|
72
|
+
- vaughan.britton@sage.com
|
73
73
|
executables: []
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
@@ -78,12 +78,17 @@ files:
|
|
78
78
|
- bin/setup
|
79
79
|
- lib/pwork.rb
|
80
80
|
- lib/pwork/array.rb
|
81
|
+
- lib/pwork/async.rb
|
82
|
+
- lib/pwork/async/exceptions.rb
|
83
|
+
- lib/pwork/async/exceptions/invalid_options.rb
|
84
|
+
- lib/pwork/async/exceptions/task_error.rb
|
85
|
+
- lib/pwork/async/manager.rb
|
86
|
+
- lib/pwork/async/task.rb
|
81
87
|
- lib/pwork/helpers/thread.rb
|
82
88
|
- lib/pwork/jruby/thread_pool.rb
|
83
89
|
- lib/pwork/mri/thread_pool.rb
|
84
|
-
- lib/pwork/version.rb
|
85
90
|
- lib/pwork/worker.rb
|
86
|
-
homepage: https://github.com/
|
91
|
+
homepage: https://github.com/sage/pwork
|
87
92
|
licenses:
|
88
93
|
- MIT
|
89
94
|
metadata: {}
|
@@ -103,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
108
|
version: '0'
|
104
109
|
requirements: []
|
105
110
|
rubyforge_project:
|
106
|
-
rubygems_version: 2.
|
111
|
+
rubygems_version: 2.7.6
|
107
112
|
signing_key:
|
108
113
|
specification_version: 4
|
109
114
|
summary: This is a library to facilitate with the execution of work on parallel threads.
|
data/lib/pwork/version.rb
DELETED