asynchronous 1.0.0 → 1.0.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.0.1
@@ -53,4 +53,23 @@ calculation.value += 1
53
53
 
54
54
  puts calculation.value
55
55
 
56
- #>--------------------------------------------------
56
+ #>--------------------------------------------------
57
+
58
+ # more complex way
59
+
60
+ puts "mixed usecase with arrays as return obj"
61
+ calc1 = async :parallelism do
62
+
63
+ sleep 4
64
+ # some big database processing brutal memory eater stuff
65
+ [4*5,"hy"]
66
+
67
+ end
68
+
69
+ calc2 = async {
70
+ [5+1,"sup!"]
71
+ }
72
+
73
+ puts calc1.value == calc2.value
74
+ puts (calc1.value+calc2.value).inspect
75
+
@@ -0,0 +1,26 @@
1
+ require_relative "../lib/asynchronous"
2
+
3
+ calculation = async :parallelism do
4
+
5
+ # Zombie!
6
+ loop do
7
+ sleep 1
8
+ end
9
+ # inf loop
10
+ #
11
+
12
+ end
13
+
14
+ puts $$
15
+ Thread.new do
16
+ sleep 5
17
+
18
+ # this want to demonstrate that,
19
+ # if the main process is killed,
20
+ # you wont leave zombies behind!
21
+ system "kill -9 #{$$}"
22
+ end
23
+
24
+ loop do
25
+ sleep 1
26
+ end
@@ -8,6 +8,7 @@ class CleanClass < BasicObject
8
8
  :object_id,
9
9
  :__send__,
10
10
  :methods,
11
+ :alias,
11
12
  :new
12
13
  ]).each do |method|
13
14
  undef_method method
@@ -62,4 +62,13 @@ module Asynchronous
62
62
 
63
63
  end
64
64
 
65
+ # alias
66
+ begin
67
+ #alias :v :value
68
+ #alias :get :value
69
+ #alias :gets :value
70
+ #alias :response :value
71
+ #alias :return :value
72
+ end
73
+
65
74
  end
@@ -9,28 +9,145 @@ module Asynchronous
9
9
  # when you need to update objects in the memory use :concurrency
10
10
  class Parallelism < CleanClass
11
11
 
12
- # Basic
12
+ # Basic class variables
13
13
  begin
14
- @@pids=[]
15
- def initialize callable
16
14
 
17
- @value= nil
18
- @rd, @wr = ::IO.pipe
19
- @pid= ::Kernel.fork do
15
+ @@pids ||= []
16
+ @@tmpdir ||= nil
17
+ @@motherpid ||= $$
18
+ @@agent ||= nil
19
+ @@zombie ||= true
20
20
 
21
- ::Kernel.trap("TERM") do
22
- exit
23
- end
21
+ end
24
22
 
25
- @rd.close
26
- @wr.write ::Marshal.dump(callable.call)#.to_yaml
27
- @wr.close
23
+ # main def for logic
24
+ begin
25
+ def initialize callable
26
+
27
+ # defaults
28
+ begin
29
+ @value= nil
30
+ @rd, @wr = ::IO.pipe
31
+ end
32
+
33
+ # create a process
34
+ begin
35
+ @pid= ::Kernel.fork do
36
+
37
+ # anti zombie
38
+ begin
39
+ ::Kernel.trap("TERM") do
40
+ ::Kernel.exit
41
+ end
42
+ ::Thread.new do
43
+ ::Kernel.loop do
44
+ begin
45
+ ::Kernel.sleep 1
46
+ if mother? == false
47
+ ::Kernel.exit!
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ # return the value
55
+ begin
56
+ @rd.close
57
+ @wr.write ::Marshal.dump(callable.call)
58
+ @wr.close
59
+ end
28
60
 
61
+ end
62
+ @@pids.push(@pid)
29
63
  end
30
64
 
31
- @@pids.push(@pid)
65
+ end
66
+ end
67
+
68
+ # connection for in case of mother die
69
+ begin
32
70
 
71
+ #def tmpdir
72
+ #
73
+ # ::Kernel.require "tmpdir"
74
+ # @@tmpdir= ::File.join(::Dir.tmpdir,('asynchronous'))
75
+ # unless ::File.directory?(@@tmpdir)
76
+ # ::Dir.mkdir(@@tmpdir)
77
+ # end
78
+ #
79
+ # %w[ signal ].each do |one_str|
80
+ # unless ::File.directory?(::File.join(@@tmpdir,one_str))
81
+ # ::Dir.mkdir(::File.join(@@tmpdir,one_str))
82
+ # end
83
+ # end
84
+ #
85
+ # # pidnamed tmp file for tracking
86
+ # unless ::File.exist?(::File.join(@@tmpdir,'signal',@@motherpid.to_s))
87
+ # ::File.new(::File.join(@@tmpdir,'signal',@@motherpid.to_s),"w").write('')
88
+ # end
89
+ #
90
+ #end
91
+ #
92
+ #def tmp_write_agent
93
+ # if @@agent != true
94
+ # ::Thread.new do
95
+ # ::Kernel.loop do
96
+ # ::File.open(::File.join(@@tmpdir,"signal",@@motherpid.to_s),"w") do |file|
97
+ # file.write( ::Time.now.to_i.to_s )
98
+ # end
99
+ # sleep 3
100
+ # end
101
+ # end
102
+ # @@agent ||= true
103
+ # end
104
+ #end
105
+ #
106
+ #def tmp_read
107
+ #
108
+ # counter= 0
109
+ # begin
110
+ #
111
+ # ::Kernel.loop do
112
+ # return_string= ::File.open(
113
+ # ::File.join(@@tmpdir,"signal",@@motherpid.to_s),
114
+ # ::File::RDONLY
115
+ # ).read
116
+ #
117
+ # if !return_string.nil? && return_string != ""
118
+ # return return_string
119
+ # else
120
+ # if counter > 5
121
+ # return nil
122
+ # else
123
+ # counter += 1
124
+ # ::Kernel.sleep(1)
125
+ # end
126
+ # end
127
+ #
128
+ # end
129
+ #
130
+ # rescue ::IOError
131
+ # if counter > 5
132
+ # return nil
133
+ # else
134
+ # counter += 1
135
+ # end
136
+ # ::Kernel.sleep 1
137
+ # retry
138
+ # end
139
+ #
140
+ #end
141
+
142
+ def mother?
143
+ begin
144
+ ::Process.kill(0,@@motherpid)
145
+ return true
146
+ rescue ::Errno::ESRCH
147
+ return false
148
+ end
33
149
  end
150
+
34
151
  end
35
152
 
36
153
  # return value
@@ -41,7 +158,6 @@ module Asynchronous
41
158
  if @value.nil?
42
159
 
43
160
  @wr.close
44
- return_value= @rd.read
45
161
  return_value= ::Marshal.load(return_value)
46
162
  @rd.close
47
163
  @@pids.delete(@pid)
@@ -72,5 +188,14 @@ module Asynchronous
72
188
  }
73
189
  end
74
190
 
191
+ # alias
192
+ begin
193
+ alias :v :value
194
+ #alias :get :value
195
+ #alias :gets :value
196
+ #alias :response :value
197
+ #alias :return :value
198
+ end
199
+
75
200
  end
76
201
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asynchronous
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-11 00:00:00.000000000 Z
12
+ date: 2014-01-13 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'DSL for for dead simple to use asynchronous patterns in both VM managed
15
15
  and OS managed way (Concurrency and Parallelism) '
@@ -28,6 +28,7 @@ files:
28
28
  - VERSION
29
29
  - asynchronous.gemspec
30
30
  - examples/async_patterns.rb
31
+ - examples/no_zombie_test.rb
31
32
  - files.rb
32
33
  - lib/asynchronous.rb
33
34
  - lib/asynchronous/clean_class.rb