pwork 1.0.0 → 1.0.1

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: 15f4c4a2ca14320dff30454942391f11899747b3
4
- data.tar.gz: 6e7236ea011bcf47d87cf46d6c89e8ede2155bb8
3
+ metadata.gz: 2731486c2af84b607e31651780ca3b57511e1496
4
+ data.tar.gz: ddbe9066147e3a962302493eecc992541a221290
5
5
  SHA512:
6
- metadata.gz: 705e7f465d1673a350251eece6c535315e3f741dcea389603ced860914aca98619733301848c5f1503ebed904594cbf5bfb36632d8400588b1eabfc8c247115d
7
- data.tar.gz: 38dd75cbedf92bd3ada6f3225e17f41f89509c74cc989322add0d51ca318ea0c04b84f50d6e55f9300338e25cd319e6839ddf4b1d47631d51bc9730a1bcedb82
6
+ metadata.gz: 75958149fd8a60da17ff86b7e1d2a9750944d1f4a5e5bc0177a416f6ab7c4795f46350cd694395414813112859684cd456c57fb8e0613e9e33e8f7d2149a7a38
7
+ data.tar.gz: 25fc545ed0139c580d5f5f8fcf6fd80b87cd17688603882984421729480feeb1b332e482cda1c01f1b69911599e8f301a1e3b693d2e0e6d2d37ff2057a20fd17
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "pwork"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/lib/pwork.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'pwork/version'
2
+ require_relative 'pwork/helpers/thread'
3
+
4
+ require_relative 'pwork/array'
5
+ require_relative 'pwork/worker'
6
+
7
+ if RUBY_PLATFORM =~ /java/
8
+ require_relative 'pwork/jruby/thread_pool'
9
+ else
10
+ require_relative 'pwork/mri/thread_pool'
11
+ end
@@ -0,0 +1,47 @@
1
+ class Array
2
+
3
+ #This method is called to loop over each item in this array in parallel threads
4
+ def peach(thread_count = 5, &block)
5
+ @mutex = Mutex.new
6
+ @index_count = -1
7
+ threads = []
8
+
9
+ thread_vars = PWork::Helpers::Threads.get_thread_vars
10
+
11
+ thread_count.times.each do
12
+ thread = Thread.new do
13
+ PWork::Helpers::Threads.set_thread_vars(thread_vars)
14
+ thread_process(&block)
15
+ end
16
+ threads.push(thread)
17
+ end
18
+ #wait for all threads to exit
19
+ threads.each { |thr| thr.join }
20
+ end
21
+
22
+ #This method is used to recursively process an item on a thread
23
+ def thread_process(&block)
24
+
25
+ item = nil
26
+
27
+ #use a mutex to get the next item from the array to ensure thread safety
28
+ @mutex.synchronize do
29
+ @index_count += 1
30
+
31
+ if @index_count <= self.length - 1
32
+ item = self[@index_count]
33
+ end
34
+ end
35
+
36
+ if item == nil
37
+ return
38
+ end
39
+
40
+ #execute the block for the current item
41
+ yield item
42
+
43
+ #recursively attempt to process another item from the array opn this thread
44
+ thread_process(&block)
45
+ end
46
+
47
+ end
@@ -0,0 +1,26 @@
1
+ module PWork
2
+ module Helpers
3
+ class Threads
4
+ def self.get_thread_vars
5
+ vars = {}
6
+ Thread.current.keys.each do |k|
7
+ vars[k] = Thread.current[k]
8
+ end
9
+ vars
10
+ end
11
+
12
+ def self.set_thread_vars(vars)
13
+ PWork::Helpers::Threads.reset_thread_vars
14
+ vars.keys.each do |k|
15
+ Thread.current[k] = vars[k]
16
+ end
17
+ end
18
+
19
+ def self.reset_thread_vars
20
+ Thread.current.keys.each do |k|
21
+ Thread.current[k] = nil
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ require 'java'
2
+ java_import java.util.concurrent.Executors
3
+ module PWork
4
+ class ThreadPool
5
+
6
+ def initialize(threads: 5)
7
+ @processes = []
8
+ @executor = java.util.concurrent.Executors::newFixedThreadPool threads
9
+ end
10
+
11
+ #This method is called to pass a block to be ran on a thread within the thread pool
12
+ def execute(&block)
13
+ thread_vars = PWork::Helpers::Threads.get_thread_vars
14
+ @executor.execute do
15
+ PWork::Helpers::Threads.set_thread_vars(thread_vars)
16
+ block.call
17
+ end
18
+ end
19
+
20
+ def shutdown
21
+ @executor.shutdown
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module PWork
2
+ class ThreadPool
3
+ def initialize(threads: 5)
4
+ @size = threads
5
+ @jobs = Queue.new
6
+ @pool = Array.new(threads) do
7
+ Thread.new do
8
+ catch(:exit) do
9
+ loop do
10
+ job, thread_vars = @jobs.pop
11
+ PWork::Helpers::Threads.set_thread_vars(thread_vars)
12
+ job.call
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ def execute(&block)
20
+ @jobs << [block, PWork::Helpers::Threads.get_thread_vars]
21
+ end
22
+
23
+ def shutdown
24
+ @size.times do
25
+ execute { throw :exit }
26
+ end
27
+
28
+ @pool.map(&:join)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ module PWork
2
+ VERSION = "1.0.1"
3
+ end
@@ -0,0 +1,22 @@
1
+ module PWork
2
+ class Worker
3
+
4
+ def initialize(threads: 5)
5
+ @processes = []
6
+ @thread_count = threads
7
+ end
8
+
9
+ #This method is called to add a process to this worker
10
+ def add(&block)
11
+ @processes.push(block)
12
+ end
13
+
14
+ #This method is called to execute all processes attached to this worker in parallel on the specified number of threads.
15
+ def execute
16
+ @processes.peach(@thread_count) do |item|
17
+ item.call
18
+ end
19
+ end
20
+
21
+ end
22
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwork
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - vaughanbrittonage
@@ -73,7 +73,16 @@ email:
73
73
  executables: []
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
- files: []
76
+ files:
77
+ - bin/console
78
+ - bin/setup
79
+ - lib/pwork.rb
80
+ - lib/pwork/array.rb
81
+ - lib/pwork/helpers/thread.rb
82
+ - lib/pwork/jruby/thread_pool.rb
83
+ - lib/pwork/mri/thread_pool.rb
84
+ - lib/pwork/version.rb
85
+ - lib/pwork/worker.rb
77
86
  homepage: https://github.com/vaughanbrittonsage/pwork
78
87
  licenses:
79
88
  - MIT