parallel_tasker 0.1.0 → 0.1.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: f4d9dc4e614c5092e3e3fb9f9ab98bd4a0e295d4
4
- data.tar.gz: 0c78457e01b3501c4f438696c7894427e14635de
3
+ metadata.gz: 6dd857a5fca48478d3c8cfaa8c8ee6084e124c3d
4
+ data.tar.gz: eb266b7089b264a51a8af2797686e7820cdc6c9e
5
5
  SHA512:
6
- metadata.gz: ed83725b491608eba9e48f2b81ba2ca838a0ba9e07357496f3fcaf4a1dbedfa1c33b9ae65857493006f754aa15ed4530751387c8f1f3b75d2e9efc3d3e4e2e2b
7
- data.tar.gz: 790488766ebfe04a839f02f67390e007d5e763177f495d817211acd4ef71a43a539482cc4b0073069b8d851bc3579bb46d48951d0a66a252e709f96e2def9b3c
6
+ metadata.gz: bd5657fce49273dc76034370db145b5137f979b5b655e5baa35e3c460c7c263529198c463423b6e9466c13e3048a07be1e063179773d0b929aa1107ee1f0f55a
7
+ data.tar.gz: 89d67e1dcf2da7c7bcc431384ef067508d9418b201fb8d2c9dc784199ccb5dfa306c156dedbf70ac98e657abf5eaa1edfcb1c879c95ecab194f745aca8bb12a8
@@ -1,5 +1,7 @@
1
1
  require 'thwait'
2
2
 
3
+ require_relative 'parallel_tasker/task'
4
+
3
5
  # Run tasks in parallel threads
4
6
  class ParallelTasker
5
7
 
@@ -8,7 +10,7 @@ class ParallelTasker
8
10
  # Unless block calls #run, it is called automatically.
9
11
  def initialize concurrency
10
12
  @concurrency = concurrency
11
- @tasks = {}
13
+ @tasks_queue = Queue.new
12
14
  @already_run = false
13
15
  if block_given?
14
16
  yield self
@@ -17,17 +19,12 @@ class ParallelTasker
17
19
  end
18
20
 
19
21
  # Add task to be executed.
20
- def add_task id, &task
21
- @tasks[id] = task
22
+ def add_task id, &block
23
+ @tasks_queue << Task.new(id, &block)
22
24
  end
23
25
 
24
26
  alias_method :<<, :add_task
25
27
 
26
- # Return block for task with given id
27
- def task id
28
- @tasks[id]
29
- end
30
-
31
28
  class DoubleRun < RuntimeError ; end
32
29
 
33
30
  # Execute all tasks in separate threads, with maximum asked concurrency of parallel
@@ -37,44 +34,29 @@ class ParallelTasker
37
34
  def run
38
35
  raise DoubleRun.new('#run called more than one time') if @already_run
39
36
  @already_run = true
40
- @threads = {}
41
- @concurrency = @tasks.size if @concurrency > @tasks.size
42
- pending_ids = @tasks.keys
43
- @already_running_ids = []
44
- completed_ids = []
45
- # start initial batch
46
- pending_ids.shift(@concurrency).each{|id| new_thread(id)}
47
- # wait for termination
48
- twait = ThreadsWait.new(*running_threads)
49
- twait.all_waits do |finished_thread|
50
- # update arrays
51
- completed_id = @threads.key(finished_thread)
52
- @already_running_ids.delete completed_id
53
- completed_ids << completed_id
54
- # start new thread if available and below concurrency
55
- if not pending_ids.empty? and @already_running_ids.size < @concurrency
56
- new_id = pending_ids.shift
57
- new_thread new_id
58
- twait.join_nowait *running_threads
59
- end
37
+ @result = {}
38
+ processor_threads = []
39
+ @concurrency.times do
40
+ processor_threads << new_processor_thread
60
41
  end
61
- @threads
42
+ processor_threads.each{|t| t.join }
43
+ @result
62
44
  end
63
-
45
+
64
46
  private
65
-
66
- # Create a new thread based on given id
67
- def new_thread id
68
- @threads[id] = Thread.new &@tasks[id]
69
- @already_running_ids << id
70
- end
71
-
72
- # return array of all running threads
73
- def running_threads
74
- rt = []
75
- @already_running_ids.each do |id|
76
- rt << @threads[id]
47
+
48
+ def new_processor_thread
49
+ Thread.new do
50
+ until @tasks_queue.empty?
51
+ task = @tasks_queue.pop
52
+ thread = Thread.new{task.block.call}
53
+ @result[task.id] = thread
54
+ begin
55
+ thread.join
56
+ rescue
57
+ end
58
+ end
77
59
  end
78
- rt
79
60
  end
61
+
80
62
  end
@@ -0,0 +1,18 @@
1
+ class ParallelTasker
2
+ # Task to be run
3
+ class Task
4
+
5
+ attr_accessor :id, :block
6
+
7
+ # Raised when no block was given
8
+ class NoBlockGiven < RuntimeError ; end
9
+
10
+ # Receive a task id, an a block with the task
11
+ def initialize id, &block
12
+ raise NoBlockGiven.new("No block given") unless block
13
+ @id = id
14
+ @block = block
15
+ end
16
+
17
+ end
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parallel_tasker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Pugliese Ornellas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-28 00:00:00.000000000 Z
11
+ date: 2015-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,6 +24,40 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: guard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.12'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 2.12.5
37
+ type: :development
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '2.12'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.12.5
47
+ - !ruby/object:Gem::Dependency
48
+ name: guard-rspec
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '4.5'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.5'
27
61
  description: Collects tasks to be run, then execute in parallel, with maximum specified
28
62
  concurrency.
29
63
  email: fabio.ornellas@gmail.com
@@ -32,6 +66,7 @@ extensions: []
32
66
  extra_rdoc_files: []
33
67
  files:
34
68
  - lib/parallel_tasker.rb
69
+ - lib/parallel_tasker/task.rb
35
70
  homepage: https://github.com/fornellas/parallel_tasker
36
71
  licenses:
37
72
  - GPL