parallel_tasker 0.0.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/parallel_tasker.rb +71 -0
  3. metadata +59 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0d8fe4c994ffe659c9948b4d3730eae83f855f68
4
+ data.tar.gz: 92e3a0c46fc26fd7d70f1c2ef8b22ad8da806980
5
+ SHA512:
6
+ metadata.gz: 356927b1f3c8491cb77276bb837f420fa67bfdf816c63695d1c7b461beb8857626bebfb40e2a3945de1ee6b0e9cfb5503cbf0df35e84712b826a4c1bca588818
7
+ data.tar.gz: 989da5fe6193e68cefb4d08a783e0d952b1c6b442fb18f5c749e799c0fbaf319426e465dcdc4b03852bae858aa68464e3fcefe7e984ffbb245df0e7cd3be8628
@@ -0,0 +1,71 @@
1
+ require 'thwait'
2
+
3
+ # Run tasks in parallel threads
4
+ class ParallelTasker
5
+
6
+ # Set max number of parallel threads
7
+ def initialize limit
8
+ @limit = limit
9
+ @tasks = {}
10
+ end
11
+
12
+ # Add task to be executed.
13
+ def add_task id, &task
14
+ @tasks[id] = task
15
+ end
16
+
17
+ alias_method :<<, :add_task
18
+
19
+ # Return block for task with given id
20
+ def task id
21
+ @tasks[id]
22
+ end
23
+
24
+ # Execute all tasks in separate threads, with maximum asked limit of parallel
25
+ # threads.
26
+ # Returns a Hash with all given id as keys, and its value are threads
27
+ # themselves. User can run Thread#status to see if it terminated with an
28
+ # exception (nil) or not (false), and Thread#value to get either its return
29
+ # value or returned exception.
30
+ def run
31
+ @threads = {}
32
+ @limit = @tasks.size if @limit > @tasks.size
33
+ pending_ids = @tasks.keys
34
+ @running_ids = []
35
+ completed_ids = []
36
+ # start initial batch
37
+ pending_ids.shift(@limit).each{|id| new_thread(id)}
38
+ # wait for termination
39
+ twait = ThreadsWait.new(*running_threads)
40
+ twait.all_waits do |finished_thread|
41
+ # update arrays
42
+ completed_id = @threads.key(finished_thread)
43
+ @running_ids.delete completed_id
44
+ completed_ids << completed_id
45
+ # start new thread if available and below limit
46
+ if not pending_ids.empty? and @running_ids.size < @limit
47
+ new_id = pending_ids.shift
48
+ new_thread new_id
49
+ twait.join_nowait *running_threads
50
+ end
51
+ end
52
+ @threads
53
+ end
54
+
55
+ private
56
+
57
+ # Create a new thread based on given id
58
+ def new_thread id
59
+ @threads[id] = Thread.new &@tasks[id]
60
+ @running_ids << id
61
+ end
62
+
63
+ # return array of all running threads
64
+ def running_threads
65
+ rt = []
66
+ @running_ids.each do |id|
67
+ rt << @threads[id]
68
+ end
69
+ rt
70
+ end
71
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: parallel_tasker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Fabio Pugliese Ornellas
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ description: Simple Gem that collects tasks to be run, then execute them with maximum
28
+ specified parallelism.
29
+ email: fabio.ornellas@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - lib/parallel_tasker.rb
35
+ homepage: https://github.com/fornellas/parallel_tasker
36
+ licenses:
37
+ - GPL
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 2.4.5
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: Simple Gem to help run tasks in parallel
59
+ test_files: []