/
run-multi.rb
46 lines (35 loc) · 926 Bytes
/
run-multi.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$runs = ARGV.shift
$work = []
$wake_interval = 300
$max_concurrent = 10;
$runs.to_i.times do
ARGV.each{|spec| $work.push spec}
end
$running_jobs = 0
$running_jobs_mutex = Mutex.new
`./build-release`
until $work.empty?
memdata = `free`.split
total = memdata[7].to_i
avail = memdata[12].to_i
perc = (100.0*avail)/total
puts "#{avail}/#{total} bytes free (#{perc.to_i}%)"
puts "#{$running_jobs} jobs currently running"
if perc < 50
puts "waiting for more memory"
sleep($wake_interval)
end
if $running_jobs >= $max_concurrent
puts "waiting for jobs to finish"
sleep($wake_interval)
end
task = $work.shift
Thread.new do
$running_jobs_mutex.synchronize{ $running_jobs += 1 }
puts "starting a run of #{task}"
`./run #{task} > /dev/null`
$running_jobs_mutex.synchronize{ $running_jobs -= 1 }
puts "finished a run of #{task}"
end
sleep($wake_interval)
end