procemon 0.3.4 → 0.4.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.
data/README.md CHANGED
@@ -32,6 +32,7 @@ with the right bindings
32
32
  the "simple async processing" will let you use os threads (1.9.n+)
33
33
  for multiprocessing so you can give multiple task to do and
34
34
  until you ask for the value, the process will be in the background
35
+ You can also use OS threads instead of VM Threads for real Parallelism
35
36
 
36
37
  the "require_files" shows you how can you get files from directory
37
38
  in a recursive way and stuffs like that so you can be lay
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.4
1
+ 0.4.0
@@ -1,40 +1,56 @@
1
1
  # Require Gemfile gems
2
2
  require_relative "../lib/procemon"
3
3
 
4
- calculation = async {
4
+ # you can use simple :c also instead of :concurrency
5
+ # remember :concurrency is all about GIL case, so
6
+ # you can modify the objects in memory
7
+ # This is ideal for little operations in simultaneously or
8
+ # when you need to update objects in the memory
9
+ calculation = async :concurrency do
5
10
 
6
- sleep 10
7
- 4 * 4
8
- }
11
+ sleep 2
12
+ 4 * 2
9
13
 
10
- puts "hello world"
14
+ end
15
+ puts "hello concurrency"
11
16
 
12
- calculation += 1
17
+ calculation.value += 1
13
18
 
14
- puts calculation
19
+ puts calculation.value
15
20
 
16
21
  #>--------------------------------------------------
22
+ # or you can use simple {} without sym and this will be by default a
23
+ # :concurrency pattern
17
24
 
25
+ calculation = async { sleep 3; 4 * 3 }
18
26
 
19
- test1 = async {
27
+ puts "hello simple concurrency"
20
28
 
21
- sleep 8
22
- hello= 14
23
- sup= "the world is yours"
29
+ calculation.value += 1
24
30
 
25
- sup
31
+ # remember you have to use .value to cal the return value from the code block!
32
+ puts calculation.value
26
33
 
27
- }
28
34
 
29
- test2 = async {
30
- sleep(4)
31
- "world"
32
- }
35
+ #>--------------------------------------------------
36
+ # now let's see the Parallelism
37
+ # you can use simple :p also instead of :parallelism
38
+ # remember :parallelism is all about real OS thread case, so
39
+ # you CANT modify the objects in memory only copy on write modify
40
+ # This is ideal for big operations where you need do a big process
41
+ # and only get the return value so you can do big works without the fear of the
42
+ # Garbage collector slowness or the GIL lock
43
+ # when you need to update objects in the memory use :concurrency
44
+ calculation = async :parallelism do
45
+
46
+ sleep 4
47
+ 4 * 5
48
+
49
+ end
50
+ puts "hello parallelism"
33
51
 
34
- start_time= Time.now
52
+ calculation.value += 1
35
53
 
36
- asd= test1
37
- puts asd
54
+ puts calculation.value
38
55
 
39
- puts test1.value == test2.value
40
- puts Time.now-start_time
56
+ #>--------------------------------------------------
@@ -2,8 +2,8 @@
2
2
  module Procemon
3
3
 
4
4
  require File.join(File.dirname(__FILE__),"procemon","function","require")
5
- require_relative_directory File.join("procemon","function")
6
5
  require_relative_directory File.join("procemon","mpatch")
6
+ require_relative_directory File.join("procemon","function")
7
7
 
8
8
  # load up helpers
9
9
  #Dir.glob(\
@@ -1,18 +1,13 @@
1
- Thread.abort_on_exception= true
2
- class Async #< BasicObject
3
-
4
- # remove methods!
5
- (Async.instance_methods-[
6
- :undef_method,
7
- :object_id,
8
- :__send__,
9
- :new
10
- ]).each do |method|
11
- undef_method method
12
- end
1
+ # you can use simple :c also instead of :concurrency
2
+ # remember :concurrency is all about GIL case, so
3
+ # you can modify the objects in memory
4
+ # This is ideal for little operations in simultaneously or
5
+ # when you need to update objects in the memory
6
+ class Concurrency < CleanClass
13
7
 
14
8
  def initialize(callable)
15
9
  begin
10
+ @value= nil
16
11
  @rescue_state= nil
17
12
  @thread ||= ::Thread.new { callable.call }
18
13
  @rescue_state= nil
@@ -24,11 +19,20 @@ class Async #< BasicObject
24
19
  end
25
20
 
26
21
  def value
27
- until @rescue_state.nil?
28
- puts "hahaha"
29
- sleep 1
22
+
23
+ if @value.nil?
24
+ until @rescue_state.nil?
25
+ sleep 1
26
+ end
27
+ @value= @thread.value
30
28
  end
31
- return @thread.value
29
+
30
+ return @value
31
+
32
+ end
33
+
34
+ def value=(obj)
35
+ @value= obj
32
36
  end
33
37
 
34
38
  def inspect
@@ -47,4 +51,4 @@ class Async #< BasicObject
47
51
  value.respond_to?(method, include_private)
48
52
  end
49
53
 
50
- end
54
+ end
@@ -1,5 +1,18 @@
1
1
  module Kernel
2
- def async(&block)
3
- Async.new(block)
2
+ def async(type= :Concurrency ,&block)
3
+ type= type.to_s
4
+ case type.downcase[0]
5
+ when "c"
6
+ begin
7
+ Concurrency.new(block)
8
+ end
9
+ when "p"
10
+ begin
11
+ Parallelism.new(block)
12
+ end
13
+ else
14
+ nil
15
+
16
+ end
4
17
  end
5
18
  end
@@ -0,0 +1,89 @@
1
+ # now let's see the Parallelism
2
+ # you can use simple :p also instead of :parallelism
3
+ # remember :parallelism is all about real OS thread case, so
4
+ # you CANT modify the objects in memory only copy on write modify
5
+ # This is ideal for big operations where you need do a big process
6
+ # and only get the return value so you can do big works without the fear of the
7
+ # Garbage collector slowness or the GIL lock
8
+ # when you need to update objects in the memory use :concurrency
9
+ class Parallelism < CleanClass
10
+
11
+ # Basic
12
+ begin
13
+
14
+ require 'yaml'
15
+ @@pids=[]
16
+ def initialize callable
17
+
18
+ @value= nil
19
+ @rd, @wr = ::IO.pipe
20
+ @pid= ::Kernel.fork do
21
+
22
+ ::Kernel.trap("TERM") do
23
+ exit
24
+ end
25
+
26
+ @rd.close
27
+ @wr.write callable.call.to_yaml
28
+ @wr.close
29
+
30
+ end
31
+
32
+ @@pids.push(@pid)
33
+
34
+ end
35
+
36
+ end
37
+
38
+ # return value
39
+ begin
40
+
41
+ def value
42
+
43
+ if @value.nil?
44
+
45
+ @wr.close
46
+ return_value= @rd.read
47
+ begin
48
+ return_value= ::YAML.load(return_value)
49
+ rescue ::Exception
50
+ end
51
+ @rd.close
52
+ @@pids.delete(@pid)
53
+ @value= return_value
54
+
55
+ end
56
+
57
+ return @value
58
+
59
+ end
60
+
61
+
62
+ def value=(obj)
63
+ @value= obj
64
+ end
65
+
66
+ #def method_missing(method,*args)
67
+ # value.__send__(method,*args)
68
+ #end
69
+ #
70
+ #def respond_to_missing?(method, include_private = false)
71
+ # value.respond_to?(method, include_private)
72
+ #end
73
+
74
+ end
75
+
76
+ # kill Zombies at Kernel Exit
77
+ begin
78
+ ::Kernel.at_exit {
79
+ @@pids.each { |pid|
80
+ begin
81
+ ::Process.kill(:TERM, pid)
82
+ rescue ::Errno::ESRCH, ::Errno::ECHILD
83
+ ::STDOUT.puts "`kill': No such process (Errno::ESRCH)"
84
+ end
85
+ }
86
+ }
87
+ end
88
+
89
+ end
@@ -0,0 +1,18 @@
1
+ class CleanClass < BasicObject
2
+
3
+ # remove methods from the class!
4
+ #def self.purge_methods
5
+
6
+ (self.instance_methods-[
7
+ :undef_method,
8
+ :object_id,
9
+ :__send__,
10
+ :methods,
11
+ :new
12
+ ]).each do |method|
13
+ undef_method method
14
+ end
15
+
16
+ #end
17
+
18
+ end
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.version = File.open(File.join(File.dirname(__FILE__),"VERSION")).read.split("\n")[0].chomp.gsub(' ','')
10
10
  spec.authors = ["Adam Luzsi"]
11
11
  spec.email = ["adamluzsi@gmail.com"]
12
- spec.description = %q{This is a collection of my Ruby Procs in the adventure of becoming the best! In short this provides extra tools in Application configs, argumens processing,daemonise,eval, getting source of a block,method,process and work with it, or even fuse them into a new proc , require relative files, or directories, string to duck parsing, system tmp_dir using, meta-programing stuffs,async dsl for easy concurrency patterns, micro framework that can be used alongside with any framework and a lot of monkey patch for extra functions :) follow me on github if you like my work! }
12
+ spec.description = %q{This is a collection of my Ruby Procs in the adventure of becoming the best! In short this provides extra tools in Application configs, argumens processing,daemonise,eval, getting source of a block,method,process and work with it, or even fuse them into a new proc , require relative files, or directories, string to duck parsing, system tmp_dir using, meta-programing stuffs,async dsl for easy concurrency patterns in both VM managed and OS managed way (concurrency and Parallelism), micro framework that can be used alongside with any framework and a lot of monkey patch for extra functions :) follow me on github if you like my work! }
13
13
  spec.summary = %q{Gotta catch em all!}
14
14
  spec.homepage = "https://github.com/adamluzsi/procemon"
15
15
  spec.license = "MIT"
@@ -1,22 +1,3 @@
1
1
  # Require Gemfile gems
2
2
  require_relative "../lib/procemon"
3
3
 
4
-
5
- test1 = async {
6
-
7
- sleep 8
8
- hello= 14
9
- sup= "the world is yours"
10
-
11
- sup
12
-
13
- }
14
-
15
- test2 = async {
16
- sleep(4)
17
- "world"
18
- }
19
-
20
- start_time= Time.now
21
- puts test1.value == test2.value
22
- puts Time.now-start_time
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: procemon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,15 +9,16 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-08 00:00:00.000000000 Z
12
+ date: 2014-01-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'This is a collection of my Ruby Procs in the adventure of becoming
15
15
  the best! In short this provides extra tools in Application configs, argumens processing,daemonise,eval,
16
16
  getting source of a block,method,process and work with it, or even fuse them into
17
17
  a new proc , require relative files, or directories, string to duck parsing, system
18
- tmp_dir using, meta-programing stuffs,async dsl for easy concurrency patterns, micro
19
- framework that can be used alongside with any framework and a lot of monkey patch
20
- for extra functions :) follow me on github if you like my work! '
18
+ tmp_dir using, meta-programing stuffs,async dsl for easy concurrency patterns in
19
+ both VM managed and OS managed way (concurrency and Parallelism), micro framework
20
+ that can be used alongside with any framework and a lot of monkey patch for extra
21
+ functions :) follow me on github if you like my work! '
21
22
  email:
22
23
  - adamluzsi@gmail.com
23
24
  executables: []
@@ -39,9 +40,9 @@ files:
39
40
  - lib/procemon/extra/str2duck.rb
40
41
  - lib/procemon/function/application.rb
41
42
  - lib/procemon/function/argv.rb
42
- - lib/procemon/function/async/async.rb
43
+ - lib/procemon/function/async/concurrency.rb
43
44
  - lib/procemon/function/async/kernel.rb
44
- - lib/procemon/function/async/safe_thread.rb
45
+ - lib/procemon/function/async/parallelism.rb
45
46
  - lib/procemon/function/binding/binding.rb
46
47
  - lib/procemon/function/binding/bindless.rb
47
48
  - lib/procemon/function/daemon.rb
@@ -65,6 +66,7 @@ files:
65
66
  - lib/procemon/mpatch/array.rb
66
67
  - lib/procemon/mpatch/boolean.rb
67
68
  - lib/procemon/mpatch/class.rb
69
+ - lib/procemon/mpatch/clean.rb
68
70
  - lib/procemon/mpatch/exception.rb
69
71
  - lib/procemon/mpatch/file.rb
70
72
  - lib/procemon/mpatch/hash.rb
@@ -1,15 +0,0 @@
1
- #
2
- #class SafeThread < Thread
3
- #
4
- # undef_method :initialize
5
- #
6
- #end
7
- #
8
- #
9
- #test1 = SafeThread.new { sleep(5); 2*2 }
10
- #
11
- #puts "hello world!"
12
- #
13
- #test2 = SafeThread.new { "hy" }
14
- #
15
- #puts test1.value