pwrake 2.0.1 → 2.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -9
  3. data/bin/gfwhere-pipe +33 -9
  4. data/bin/pwrake +5 -2
  5. data/bin/pwrake_branch +5 -3
  6. data/lib/pwrake/branch/branch.rb +95 -86
  7. data/lib/pwrake/branch/branch_application.rb +4 -0
  8. data/lib/pwrake/branch/communicator.rb +173 -0
  9. data/lib/pwrake/branch/communicator_set.rb +100 -0
  10. data/lib/pwrake/branch/fiber_queue.rb +10 -0
  11. data/lib/pwrake/branch/shell.rb +68 -24
  12. data/lib/pwrake/branch/shell_profiler.rb +2 -0
  13. data/lib/pwrake/gfarm/gfarm_postprocess.rb +8 -7
  14. data/lib/pwrake/logger.rb +5 -0
  15. data/lib/pwrake/master/master.rb +190 -87
  16. data/lib/pwrake/master/master_application.rb +8 -0
  17. data/lib/pwrake/nbio.rb +525 -0
  18. data/lib/pwrake/option/host_map.rb +36 -4
  19. data/lib/pwrake/option/option.rb +7 -1
  20. data/lib/pwrake/option/option_filesystem.rb +13 -3
  21. data/lib/pwrake/queue/locality_aware_queue.rb +41 -6
  22. data/lib/pwrake/queue/queue_array.rb +31 -11
  23. data/lib/pwrake/queue/task_queue.rb +15 -18
  24. data/lib/pwrake/report/report.rb +2 -0
  25. data/lib/pwrake/task/task_algorithm.rb +4 -1
  26. data/lib/pwrake/task/task_manager.rb +2 -0
  27. data/lib/pwrake/task/task_property.rb +1 -0
  28. data/lib/pwrake/task/task_wrapper.rb +40 -21
  29. data/lib/pwrake/version.rb +1 -1
  30. data/lib/pwrake/worker/invoker.rb +4 -29
  31. data/pwrake.gemspec +3 -2
  32. metadata +24 -12
  33. data/lib/pwrake/branch.rb +0 -22
  34. data/lib/pwrake/branch/worker_communicator.rb +0 -104
  35. data/lib/pwrake/iomux/channel.rb +0 -70
  36. data/lib/pwrake/iomux/handler.rb +0 -124
  37. data/lib/pwrake/iomux/handler_set.rb +0 -35
  38. data/lib/pwrake/iomux/runner.rb +0 -62
  39. data/lib/pwrake/master.rb +0 -30
@@ -1,3 +1,3 @@
1
1
  module Pwrake
2
- VERSION = "2.0.1"
2
+ VERSION = "2.1.0"
3
3
  end
@@ -1,6 +1,9 @@
1
1
  module Pwrake
2
2
 
3
3
  class Invoker
4
+ # using Michael Grosser's parallel
5
+ # https://github.com/grosser/parallel
6
+ include Parallel::ProcessorCount
4
7
 
5
8
  def initialize(dir_class, ncore, option)
6
9
  @dir_class = dir_class
@@ -161,37 +164,9 @@ module Pwrake
161
164
  $stdout.puts e
162
165
  $stdout.puts e.backtrace.join("\n")
163
166
  end
167
+ ensure
164
168
  @out.puts "exited"
165
169
  end
166
170
 
167
- # from Michael Grosser's parallel
168
- # https://github.com/grosser/parallel
169
- def processor_count
170
- host_os = RbConfig::CONFIG['host_os']
171
- case host_os
172
- when /linux|cygwin/
173
- ncpu = 0
174
- open("/proc/cpuinfo").each do |l|
175
- ncpu += 1 if /^processor\s+: \d+/=~l
176
- end
177
- ncpu
178
- when /darwin9/
179
- `hwprefs cpu_count`.to_i
180
- when /darwin/
181
- (hwprefs_available? ? `hwprefs thread_count` : `sysctl -n hw.ncpu`).to_i
182
- when /(open|free)bsd/
183
- `sysctl -n hw.ncpu`.to_i
184
- when /mswin|mingw/
185
- require 'win32ole'
186
- wmi = WIN32OLE.connect("winmgmts://")
187
- cpu = wmi.ExecQuery("select NumberOfLogicalProcessors from Win32_Processor")
188
- cpu.to_enum.first.NumberOfLogicalProcessors
189
- when /solaris2/
190
- `psrinfo -p`.to_i # physical cpus
191
- else
192
- raise "Unknown architecture: #{host_os}"
193
- end
194
- end
195
-
196
171
  end
197
172
  end
data/pwrake.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Pwrake::VERSION
9
9
  gem.authors = ["Masahiro TANAKA"]
10
10
  gem.email = ["masa16.tanaka@gmail.com"]
11
- gem.description = %q{Parallel workflow extension for Rake}
12
- gem.summary = %q{Adding Parallel and Distributed feature to Rake}
11
+ gem.summary = %q{Parallel Workflow engine based on Rake}
12
+ gem.description = %q{Parallel Workflow engine based on Rake, runs on multicores, clusters, clouds}
13
13
  gem.homepage = "http://masa16.github.com/pwrake"
14
14
  gem.license = 'MIT'
15
15
 
@@ -17,4 +17,5 @@ Gem::Specification.new do |gem|
17
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ["lib"]
20
+ gem.add_runtime_dependency 'parallel', '>= 1.2.4'
20
21
  end
metadata CHANGED
@@ -1,16 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwrake
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro TANAKA
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-02 00:00:00.000000000 Z
12
- dependencies: []
13
- description: Parallel workflow extension for Rake
11
+ date: 2016-05-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: parallel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.4
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.4
27
+ description: Parallel Workflow engine based on Rake, runs on multicores, clusters,
28
+ clouds
14
29
  email:
15
30
  - masa16.tanaka@gmail.com
16
31
  executables:
@@ -29,22 +44,17 @@ files:
29
44
  - bin/gfwhere-pipe
30
45
  - bin/pwrake
31
46
  - bin/pwrake_branch
32
- - lib/pwrake/branch.rb
33
47
  - lib/pwrake/branch/branch.rb
34
48
  - lib/pwrake/branch/branch_application.rb
49
+ - lib/pwrake/branch/communicator.rb
50
+ - lib/pwrake/branch/communicator_set.rb
35
51
  - lib/pwrake/branch/fiber_queue.rb
36
52
  - lib/pwrake/branch/file_utils.rb
37
53
  - lib/pwrake/branch/shell.rb
38
54
  - lib/pwrake/branch/shell_profiler.rb
39
- - lib/pwrake/branch/worker_communicator.rb
40
55
  - lib/pwrake/gfarm/gfarm_path.rb
41
56
  - lib/pwrake/gfarm/gfarm_postprocess.rb
42
- - lib/pwrake/iomux/channel.rb
43
- - lib/pwrake/iomux/handler.rb
44
- - lib/pwrake/iomux/handler_set.rb
45
- - lib/pwrake/iomux/runner.rb
46
57
  - lib/pwrake/logger.rb
47
- - lib/pwrake/master.rb
48
58
  - lib/pwrake/master/fiber_pool.rb
49
59
  - lib/pwrake/master/idle_cores.rb
50
60
  - lib/pwrake/master/master.rb
@@ -52,6 +62,7 @@ files:
52
62
  - lib/pwrake/master/postprocess.rb
53
63
  - lib/pwrake/misc/graphviz.rb
54
64
  - lib/pwrake/misc/mcgp.rb
65
+ - lib/pwrake/nbio.rb
55
66
  - lib/pwrake/option/host_map.rb
56
67
  - lib/pwrake/option/option.rb
57
68
  - lib/pwrake/option/option_filesystem.rb
@@ -121,7 +132,7 @@ rubyforge_project:
121
132
  rubygems_version: 2.5.1
122
133
  signing_key:
123
134
  specification_version: 4
124
- summary: Adding Parallel and Distributed feature to Rake
135
+ summary: Parallel Workflow engine based on Rake
125
136
  test_files:
126
137
  - spec/001/Rakefile
127
138
  - spec/002/Rakefile
@@ -140,3 +151,4 @@ test_files:
140
151
  - spec/helper.rb
141
152
  - spec/hosts
142
153
  - spec/pwrake_spec.rb
154
+ has_rdoc:
data/lib/pwrake/branch.rb DELETED
@@ -1,22 +0,0 @@
1
- require "logger"
2
- require 'csv'
3
-
4
- require "pwrake/logger"
5
-
6
- require "pwrake/iomux/channel"
7
- require "pwrake/iomux/handler"
8
- require "pwrake/iomux/handler_set"
9
- require "pwrake/iomux/runner"
10
-
11
- require "pwrake/branch/branch_application"
12
- require "pwrake/branch/branch"
13
- require "pwrake/branch/fiber_queue"
14
- require "pwrake/branch/file_utils"
15
-
16
- require 'pwrake/branch/shell_profiler'
17
- require "pwrake/branch/shell"
18
- require "pwrake/branch/worker_communicator"
19
-
20
- require "pwrake/option/option"
21
- require "pwrake/option/option_filesystem"
22
- require "pwrake/option/host_map"
@@ -1,104 +0,0 @@
1
- module Pwrake
2
-
3
- class WorkerCommunicator
4
-
5
- HOST2ID = {}
6
- RE_ID='\d+'
7
- attr_reader :id, :host, :ncore, :handler, :channel
8
-
9
- def self.read_worker_progs(option)
10
- d = File.dirname(__FILE__)+'/../worker/'
11
- code = ""
12
- option.worker_progs.each do |f|
13
- code << IO.read(d+f+'.rb')
14
- end
15
- code
16
- end
17
-
18
- def initialize(id,host,ncore,runner,option)
19
- @id = id
20
- @host = host
21
- HOST2ID[@host] = @id
22
- @ncore = @n_total_core = ncore
23
- #
24
- @runner = runner
25
- @worker_progs = option.worker_progs
26
- @option = option.worker_option
27
- if hb = @option[:heartbeat]
28
- @heartbeat_timeout = hb + 15
29
- end
30
- end
31
-
32
- def setup_connection(worker_code)
33
- rb_cmd = "ruby -e 'eval ARGF.read(#{worker_code.size})'"
34
- if ['localhost','localhost.localdomain','127.0.0.1'].include? @host
35
- cmd = "cd; #{rb_cmd}"
36
- else
37
- cmd = "ssh -x -T -q #{@option[:ssh_option]} #{@host} \"#{rb_cmd}\""
38
- end
39
- Log.debug cmd
40
- @handler = Handler.new(@runner) do |w0,w1,r2|
41
- @pid = spawn(cmd,:pgroup=>true,:out=>w0,:err=>w1,:in=>r2)
42
- w0.close
43
- w1.close
44
- r2.close
45
- end
46
- @handler.host = @host
47
- iow = @handler.iow
48
- iow.write(worker_code)
49
- Marshal.dump(@ncore,iow)
50
- Marshal.dump(@option,iow)
51
- @channel = Channel.new(@handler)
52
- end
53
-
54
- def close
55
- if !@closed
56
- @closed = true
57
- @handler.close
58
- end
59
- end
60
-
61
- def set_ncore(ncore)
62
- @ncore = ncore
63
- end
64
-
65
- def ncore_proc(s)
66
- if /^ncore:(.*)$/ =~ s
67
- a = $1
68
- Log.debug "#{a} @#{@host}"
69
- if /^(\d+)$/ =~ a
70
- set_ncore($1.to_i)
71
- return false
72
- else
73
- raise ArgumentError,"WorkerCommunicator#ncore_proc: s=#{s.inspect}"
74
- end
75
- else
76
- return common_line(s)
77
- end
78
- end
79
-
80
- def common_line(s)
81
- Log.debug "WorkerCommunicator#common_line(#{s.inspect}) id=#{@id} host=#{@host}"
82
- case s
83
- when /^heartbeat$/
84
- @runner.heartbeat(@handler.ior)
85
- when /^exited$/
86
- return false
87
- when /^log:(.*)$/
88
- Log.info "worker(#{host})>#{$1}"
89
- else
90
- Log.warn "worker(#{host}) out> #{s.inspect}"
91
- end
92
- true
93
- end
94
-
95
- def start_default_fiber
96
- Fiber.new do
97
- while common_line(@channel.get_line)
98
- end
99
- Log.debug "WorkerCommunicator: end of default fiber"
100
- end.resume
101
- end
102
-
103
- end
104
- end
@@ -1,70 +0,0 @@
1
- module Pwrake
2
-
3
- class Channel
4
-
5
- def initialize(handler,id=nil)
6
- if @id = id
7
- @pre = "#{@id}:"
8
- else
9
- @pre = ""
10
- end
11
- if !handler.kind_of?(Handler)
12
- raise TypeError, "Argument must be Handler but #{handler.class}"
13
- end
14
- @handler = handler
15
- end
16
-
17
- attr_reader :id, :handler, :fiber
18
-
19
- def ior
20
- @handler.ior
21
- end
22
-
23
- def run_fiber(*args)
24
- if @fiber.nil?
25
- m = "Channel#run_fiber: @fiber is nil,"+
26
- " args=#{args.inspect} @id=#{@id}"
27
- $stderr.puts m
28
- Log.debug m
29
- else
30
- @fiber.resume(*args)
31
- end
32
- end
33
-
34
- def finish
35
- if !@fiber.nil?
36
- @fiber.resume(nil)
37
- end
38
- end
39
-
40
- def get_line
41
- @handler.add_channel(self)
42
- @fiber = Fiber.current
43
- line = Fiber.yield
44
- @fiber = nil
45
- @handler.delete_channel(self)
46
- return line
47
- end
48
-
49
- def put_line(line)
50
- @handler.put_line "#{@pre}#{line}"
51
- end
52
-
53
- def puts(line)
54
- @handler.puts "#{@pre}#{line}"
55
- end
56
-
57
- def gets
58
- if @id
59
- raise RuntimeError,"gets is invalid when @id is non-nil"
60
- else
61
- @handler.gets
62
- end
63
- end
64
-
65
- def inspect
66
- "#<#{self.class} io=#{ior.inspect} id=#{id.inspect}>"
67
- end
68
- end
69
-
70
- end
@@ -1,124 +0,0 @@
1
- module Pwrake
2
-
3
- class Handler
4
-
5
- def initialize(runner,*io,&blk)
6
- if !runner.kind_of?(Runner)
7
- raise TypeError, "Argument must be Runner but #{runner.class}"
8
- end
9
- @runner = runner
10
- @channel = {}
11
- if !io.empty?
12
- if !block_given?
13
- @ior,@iow,@ioe = *io
14
- end
15
- else
16
- if block_given?
17
- @ior,w0 = IO.pipe
18
- @ioe,w1 = IO.pipe
19
- r2,@iow = IO.pipe
20
- yield(w0,w1,r2)
21
- end
22
- end
23
- if @ior.nil? && @iow.nil?
24
- raise "fail to initialize IO"
25
- end
26
- end
27
-
28
- attr_reader :runner, :ior, :iow, :ioe
29
- attr_accessor :host
30
-
31
- def add_channel(chan)
32
- if !chan.kind_of?(Channel)
33
- raise TypeError, "Argument must be Channel but #{chan.class}"
34
- end
35
- @channel[chan.id] = chan
36
- @runner.add_handler(self)
37
- end
38
-
39
- def delete_channel(chan)
40
- if !chan.kind_of?(Channel)
41
- raise TypeError, "Argument must be Channel but #{chan.class}"
42
- end
43
- @channel.delete(chan.id)
44
- if @channel.empty?
45
- @runner.delete_handler(self)
46
- end
47
- end
48
-
49
- def process_line
50
- if s = (@ior.eof?) ? nil : @ior.gets
51
- default_channel = @channel[nil]
52
- if @channel.size > ((default_channel) ? 1 : 0)
53
- if /^(\d+):(.*)$/ =~ s
54
- ch,line = $1,$2
55
- if chan = @channel[ch.to_i]
56
- return chan.run_fiber(line)
57
- else
58
- raise "No channel##{ch}"
59
- end
60
- end
61
- end
62
- if default_channel
63
- return default_channel.run_fiber(s.chomp)
64
- else
65
- raise "No default_channel, received: #{s.chomp}"
66
- end
67
- else
68
- # End of IO
69
- @channel.values.each do |chan|
70
- if chan.fiber
71
- chan.run_fiber(nil)
72
- end
73
- end
74
- end
75
- end
76
-
77
- def finish
78
- @channel.values.each do |chan|
79
- chan.finish
80
- end
81
- end
82
-
83
- # -- writer
84
-
85
- def put_line(line)
86
- begin
87
- @iow.print line.to_str+"\n"
88
- @iow.flush
89
- #Log.debug "Handler#put_line #{line.inspect} @iow=#{@iow.inspect}"
90
- rescue Errno::EPIPE => e
91
- if Rake.application.options.debug
92
- $stderr.puts "Errno::EPIPE in #{self.class}.put_line '#{line.chomp}'"
93
- $stderr.puts e.backtrace.join("\n")
94
- end
95
- Log.error "Errno::EPIPE in #{self.class}.put_line '#{line.chomp}'\n"+
96
- e.backtrace.join("\n")
97
- #raise e
98
- end
99
- end
100
-
101
- def puts(line)
102
- @iow.puts(line)
103
- end
104
-
105
- def gets
106
- @ior.gets
107
- end
108
-
109
- def wait_message(end_msg)
110
- if line = @ior.gets
111
- line.chomp!
112
- m = "Handler#wait_message: #{line} host=#{@host}"
113
- if line == end_msg
114
- Log.debug m
115
- else
116
- Log.error m
117
- end
118
- else
119
- Log.error "Handler#wait_message: fail to read @ior"
120
- end
121
- end
122
-
123
- end
124
- end