abundance 1.0.1 → 1.0.2
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.
- data/lib/abundance.rb +2 -0
- data/lib/garden.rb +7 -3
- data/lib/gardener.rb +10 -12
- data/lib/seed.rb +2 -2
- metadata +2 -3
- data/lib/test.rb +0 -121
data/lib/abundance.rb
CHANGED
data/lib/garden.rb
CHANGED
@@ -3,8 +3,9 @@
|
|
3
3
|
# The Garden is where the thread concurency is implemented,
|
4
4
|
# offering itself as a thread queue manager,
|
5
5
|
# dispatching seeds from the Gardener to its Rows child class and back again.
|
6
|
-
# Since Ruby doesn't implement Native Threads,
|
7
|
-
#
|
6
|
+
# it does so using its child class, the Rows. Since Ruby doesn't implement Native Threads,
|
7
|
+
# and only Native Threads scales to multi-core execution, the way to implement concurent execution is
|
8
|
+
# through splitting the task at hand between multiple single threaded parallel executions.
|
8
9
|
# The Rows system does exactly that, using the Ruby fork function, then connecting the isolated running
|
9
10
|
# processes to the Garden, through a simple socket system provided by the Toolshed Module.
|
10
11
|
#
|
@@ -77,7 +78,8 @@ class Garden
|
|
77
78
|
when :growth
|
78
79
|
case data
|
79
80
|
when :progress
|
80
|
-
|
81
|
+
value = @crops.size.to_f / (@crops.size + @sprouts.compact.size + @seeds.size)
|
82
|
+
value = 1 if value.nan?; progress = sprintf( "%.2f", value)
|
81
83
|
socket_server_send(command,progress,clientaddr,clientport)
|
82
84
|
when :seed
|
83
85
|
socket_server_send(command,@seeds.size,clientaddr,clientport)
|
@@ -98,10 +100,12 @@ class Garden
|
|
98
100
|
socket_server_send(command,@sprouts.compact,clientaddr,clientport)
|
99
101
|
when :crop
|
100
102
|
socket_server_send(command,@crops,clientaddr,clientport)
|
103
|
+
@crops.clear
|
101
104
|
else
|
102
105
|
if data.is_a? Integer
|
103
106
|
if @crops[data]
|
104
107
|
socket_server_send(command,@crops[data],clientaddr,clientport)
|
108
|
+
@crops[data] = nil
|
105
109
|
else
|
106
110
|
@harvest[data] = {:clientaddr => clientaddr, :clientport => clientport}
|
107
111
|
end
|
data/lib/gardener.rb
CHANGED
@@ -20,17 +20,13 @@ class Gardener
|
|
20
20
|
|
21
21
|
# The +new+ class method initializes the class.
|
22
22
|
# As part of the Abundance lib, Gardener is not initialized directly,
|
23
|
-
# but rather through
|
23
|
+
# but rather through Abundance.gardener.
|
24
24
|
# === Parameters
|
25
25
|
# * :seed_size = allowed seed size in bytes
|
26
26
|
# * :rows = garden rows number, the number of concurent threads
|
27
27
|
# * :init_timeout = allow to pause execution to allow for larger gardens to initialize
|
28
28
|
# === Example
|
29
|
-
# gardener = Gardener.new({:seed_size => 1024, :rows => 6, :init_timeout
|
30
|
-
# Abundance.grow do |seed|
|
31
|
-
# seed.crop(`#{seed.sprout}`)
|
32
|
-
# end
|
33
|
-
# end
|
29
|
+
# gardener = Gardener.new({:seed_size => 1024, :rows => 6, :init_timeout}) { your_special_garden function }
|
34
30
|
#
|
35
31
|
|
36
32
|
def initialize(options,gardener_block)
|
@@ -47,7 +43,7 @@ class Gardener
|
|
47
43
|
# === Parameter
|
48
44
|
# * _command_ = a ruby expression or object
|
49
45
|
# === Example
|
50
|
-
# id_seed_1 = gardener.seed('ruby -v')
|
46
|
+
# id_seed_1 = gardener.seed(system 'ruby -v')
|
51
47
|
|
52
48
|
def seed(command)
|
53
49
|
command, data = socket_client_perm_duplex(:seed,command)
|
@@ -70,17 +66,19 @@ class Gardener
|
|
70
66
|
return data
|
71
67
|
end
|
72
68
|
|
73
|
-
# The +harvest+ method for the Gardener instance allow to get arrays of results for each queue level
|
69
|
+
# The +harvest+ method for the Gardener instance allow to get arrays of results for each queue level.
|
70
|
+
# It has two different behaviour on queue data, one for ripe elements where it removes them from crop array ( on _seedID_ and :crop invocations ),
|
71
|
+
# for all other methods of invocation it leaves the queue intact.
|
74
72
|
# === Parameter
|
75
73
|
# The parameter given as a symbol specifies the level of queue results you wish to get:
|
76
|
-
# *
|
77
|
-
# * :crop = return an array of seed for which process has completed
|
74
|
+
# * seedID = return the result for a specific seed, if seed hasn't processed it wait until completed, _seedID_ is removed from crop array
|
75
|
+
# * :crop = return an array of seed for which process has completed, empties the crop array.
|
78
76
|
# * :sprout = return an array of seed actually processing
|
79
77
|
# * :seed = return an array of seed waiting to be processed
|
80
78
|
# * :all = return a hash of respective arrays for crops, sprouts and seeds
|
81
79
|
# === Example
|
82
|
-
#
|
83
|
-
|
80
|
+
# seed1_result = gardener.harvest(id_seed_1)
|
81
|
+
|
84
82
|
def harvest(crop)
|
85
83
|
command, data = socket_client_perm_duplex(:harvest,crop)
|
86
84
|
return data
|
data/lib/seed.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# This class provides the seed part of the Gardener,Garden,Seed natural design patern
|
2
2
|
#
|
3
3
|
# In nature, seed is usually small, and so is this class.
|
4
|
-
# No
|
4
|
+
# No atributes/variables of itself, its only a kind of localized getter/setter class for
|
5
5
|
# the global $seed variable. Every garden row assess one fork-localized $seed variable, and
|
6
6
|
# you get access to it from a +seed+ instance passed to every Abundance.grow iteration.
|
7
7
|
#
|
@@ -14,7 +14,7 @@ class Seed
|
|
14
14
|
|
15
15
|
# The +new+ class method initializes the class.
|
16
16
|
# You don't have to initialize it inside of Abundance,
|
17
|
-
# as it gets initialized automatically inside the Abundance.grow method
|
17
|
+
# as it gets initialized automatically inside the +Abundance.grow+ method
|
18
18
|
|
19
19
|
# The +sprout+ method for the Seed instance allow to get the passed command
|
20
20
|
# from the inside the Abundance.grow block.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abundance
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Louis-Philippe Perron
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-12-
|
12
|
+
date: 2008-12-04 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -26,7 +26,6 @@ files:
|
|
26
26
|
- lib/garden.rb
|
27
27
|
- lib/gardener.rb
|
28
28
|
- lib/seed.rb
|
29
|
-
- lib/test.rb
|
30
29
|
- lib/toolshed.rb
|
31
30
|
has_rdoc: true
|
32
31
|
homepage: http://abundance.rubyforge.org/
|
data/lib/test.rb
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
require 'pty'
|
2
|
-
require 'expect'
|
3
|
-
require 'abundance'
|
4
|
-
|
5
|
-
# puts "Init pid #{Process.pid}"
|
6
|
-
#
|
7
|
-
# g = Abundance.gardener(:seed_size => 8192, :rows => 1, :init_timeout => 1) do
|
8
|
-
# puts "Garden init done, pid: #{Process.pid}"
|
9
|
-
# puts "@@ yield just before growing..."
|
10
|
-
# Abundance.grow do |seed|
|
11
|
-
# puts "@@ yield #{Time.now}: got in here"
|
12
|
-
# puts "@@ yield job: #{seed.sprout}"
|
13
|
-
# seed.crop(true, "Bravo!!gadigooo!!")
|
14
|
-
# end
|
15
|
-
# puts "Garden seeded"
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# g.seed("jobidoo")
|
19
|
-
# puts "First chore sent"
|
20
|
-
# g.seed("jobidaa")
|
21
|
-
# puts "second chore sent"
|
22
|
-
# g.seed("jobidob")
|
23
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
24
|
-
# g.seed("jobidoc")
|
25
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
26
|
-
# id = g.seed("jobidod")
|
27
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
28
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!!!!! waiting for harvest: #{id.class.to_s}"
|
29
|
-
# har = g.harvest(id)
|
30
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!!!!! famous harvest: #{har.inspect}"
|
31
|
-
# g.seed("jobidoe")
|
32
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
33
|
-
# g.seed("jobidof")
|
34
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
35
|
-
# g.seed("jobidog")
|
36
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
37
|
-
# g.seed("jobidoh")
|
38
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
39
|
-
# g.seed("jobidoi")
|
40
|
-
# puts "!!! some seeds: #{g.harvest(:seed).inspect}"
|
41
|
-
# puts "!!! some sprouts: #{g.harvest(:sprout).inspect}"
|
42
|
-
# puts "!!! some crops: #{g.harvest(:crop).inspect}"
|
43
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
44
|
-
# g.seed("jobidoj")
|
45
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
46
|
-
# g.seed("jobidok")
|
47
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
48
|
-
# g.seed("jobidol")
|
49
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
50
|
-
# g.seed("jobidom")
|
51
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
52
|
-
# g.seed("jobidon")
|
53
|
-
# g.seed("jobidop")
|
54
|
-
# g.seed("jobidoq")
|
55
|
-
# g.seed("jobidor")
|
56
|
-
# g.seed("jobidos")
|
57
|
-
# g.seed("jobidot")
|
58
|
-
# g.seed("jobidou")
|
59
|
-
# g.seed("jobidov")
|
60
|
-
# g.seed("jobidow")
|
61
|
-
# g.seed("jobidox")
|
62
|
-
# g.seed("jobidoy")
|
63
|
-
# g.seed("jobidoz")
|
64
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
65
|
-
# sleep 30
|
66
|
-
# puts "!!! some seeds: #{g.harvest(:seed).inspect}"
|
67
|
-
# puts "!!! some sprouts: #{g.harvest(:sprout).inspect}"
|
68
|
-
# puts "!!! some crops: #{g.harvest(:crop).inspect}"
|
69
|
-
# sleep 5
|
70
|
-
# puts "!!!!!!!!!!!!!!!!!!!!!!! growth: #{g.growth}"
|
71
|
-
# fin = g.close
|
72
|
-
# puts "on close #{fin.inspect}"
|
73
|
-
|
74
|
-
puts "Init pid #{Process.pid}"
|
75
|
-
|
76
|
-
g = Abundance.gardener(:seed_size => 8192, :rows => 1, :init_timeout => 3) do
|
77
|
-
puts "@@ yield just before growing..."
|
78
|
-
PTY.spawn('smbclient //spiralgemini/geminishare goLEELAubu -U leelasheel') do |r,w,pid|
|
79
|
-
w.sync = true
|
80
|
-
$expect_verbose = false
|
81
|
-
|
82
|
-
r.expect(/.*smb: \\>.*/) do |text|
|
83
|
-
puts "!!! starter: #{text}"
|
84
|
-
end
|
85
|
-
Abundance.grow do |seed|
|
86
|
-
neew = seed.sprout
|
87
|
-
puts "??? will go for: #{neew}"
|
88
|
-
w.print "#{seed.sprout}\n"
|
89
|
-
|
90
|
-
r.expect(/.*smb: \\>/) do |text|
|
91
|
-
puts "!!! got #{text}"
|
92
|
-
unless text
|
93
|
-
r.expect(/.*smb: \\>/) do |text|
|
94
|
-
puts "!!!2 got #{text}"
|
95
|
-
seed.crop(true, text)
|
96
|
-
end
|
97
|
-
else
|
98
|
-
seed.crop(true, text)
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
puts "Garden seeded"
|
108
|
-
|
109
|
-
g.seed("ls")
|
110
|
-
puts "First chore sent"
|
111
|
-
g.seed("pwd")
|
112
|
-
puts "second chore sent"
|
113
|
-
g.seed("volume")
|
114
|
-
g.seed("help")
|
115
|
-
g.seed("du")
|
116
|
-
g.seed("put inside.rb")
|
117
|
-
sleep 20
|
118
|
-
# r = g.harvest
|
119
|
-
# puts r.inspect
|
120
|
-
fin = g.close
|
121
|
-
puts fin.inspect
|