opee 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2012, Peter Ohler
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ - Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ - Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ - Neither the name of Peter Ohler nor the names of its contributors may be
15
+ used to endorse or promote products derived from this software without
16
+ specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # Opee gem
2
+ An experimental Object-base Parallel Evaluation Environment
3
+
4
+ The purpose of this gem is to explore setting up an environment that will run
5
+ completely in parallel with minimum use of mutex synchronization. Actors only
6
+ push the flow forward, never returning values when using the ask()
7
+ method. Other methods return immediately but they should never modify the data
8
+ portions of the Actors. They can be used to modify the control of the Actor.
9
+
10
+ # plans
11
+
12
+ - create an error handler that prints or logs rescued exceptions (::Opee::Log class)
13
+
14
+ - pick a problem to test against
15
+
16
+ - describe patterns for use
17
+
18
+ - Is the notion of a job needed to follow processing of an initial input?
19
+ - avoid using job for storing data though unless rules can be set up to isolate portions of the data to a specific processing path
20
+
21
+ ### License:
22
+
23
+ Copyright (c) 2012, Peter Ohler
24
+ All rights reserved.
25
+
26
+ Redistribution and use in source and binary forms, with or without
27
+ modification, are permitted provided that the following conditions are met:
28
+
29
+ - Redistributions of source code must retain the above copyright notice, this
30
+ list of conditions and the following disclaimer.
31
+
32
+ - Redistributions in binary form must reproduce the above copyright notice,
33
+ this list of conditions and the following disclaimer in the documentation
34
+ and/or other materials provided with the distribution.
35
+
36
+ - Neither the name of Peter Ohler nor the names of its contributors may be
37
+ used to endorse or promote products derived from this software without
38
+ specific prior written permission.
39
+
40
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
41
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
43
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
44
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
46
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
47
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
48
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
49
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/lib/opee.rb ADDED
@@ -0,0 +1,5 @@
1
+
2
+ module Opee
3
+ end # Opee
4
+
5
+ require 'opee/actor'
data/lib/opee/actor.rb ADDED
@@ -0,0 +1,69 @@
1
+
2
+ module Opee
3
+
4
+ class Actor
5
+
6
+ def initialize(options={})
7
+ @queue = []
8
+ @ask_mutex = Mutex.new()
9
+ @ask_timeout = 0.0
10
+ @max_queue_count = nil
11
+ @running = true
12
+ set_options(options)
13
+ @loop = Thread.start(self) do |me|
14
+ begin
15
+ sleep(1.0) if @queue.empty?
16
+ unless @queue.empty?
17
+ a = nil
18
+ @ask_mutex.synchronize {
19
+ a = @queue.pop()
20
+ }
21
+ send(a.op, *a.args)
22
+ end
23
+ rescue Exception => e
24
+ # TBD handle errors by passing them to a error handler
25
+ puts "*** #{e.class}: #{e.message}"
26
+ e.backtrace.each { |line| puts " " + line }
27
+ end
28
+ end
29
+ end
30
+
31
+ def set_options(options)
32
+ #
33
+ end
34
+
35
+ # deep copy and freeze args if not already frozen or primitive types
36
+ def ask(op, *args)
37
+ @ask_mutex.synchronize {
38
+ @queue << Act.new(op, args)
39
+ }
40
+ @loop.wakeup() if @running
41
+ end
42
+
43
+ def queue_count()
44
+ @queue.length
45
+ end
46
+
47
+ def stop()
48
+ @running = false
49
+ end
50
+
51
+ def start()
52
+ @running = true
53
+ @loop.wakeup()
54
+ end
55
+
56
+ private
57
+
58
+ class Act
59
+ attr_accessor :op
60
+ attr_accessor :args
61
+
62
+ def initialize(op, args)
63
+ @op = op
64
+ @args = args
65
+ end
66
+ end
67
+
68
+ end # Actor
69
+ end # Opee
@@ -0,0 +1,5 @@
1
+
2
+ module Opee
3
+ # Current version of the module.
4
+ VERSION = '0.0.1'
5
+ end
data/test/tests.rb ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby -wW1
2
+ # encoding: UTF-8
3
+
4
+ $: << File.join(File.dirname(__FILE__), "../lib")
5
+
6
+ require 'test/unit'
7
+ require 'opee'
8
+
9
+ class Relay < ::Opee::Actor
10
+ attr_reader :last_data
11
+
12
+ def initialize(buddy)
13
+ super
14
+ @buddy = buddy
15
+ @last_data = nil
16
+ end
17
+
18
+ private
19
+
20
+ def relay(data)
21
+ @last_data = data
22
+ @buddy.ask(:relay, data) unless @buddy.nil?
23
+ end
24
+
25
+ end # Relay
26
+
27
+ class Opeet < ::Test::Unit::TestCase
28
+
29
+ def test_ask_queue
30
+ a = ::Relay.new(nil)
31
+ assert_equal(0, a.queue_count())
32
+ a.stop()
33
+ a.ask(:relay, 7)
34
+ assert_equal(1, a.queue_count())
35
+ a.start()
36
+ sleep(0.2)
37
+ assert_equal(7, a.last_data)
38
+ end
39
+
40
+ end # Opeet
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opee
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Peter Ohler
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-17 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: ! 'An experimental Object-base Parallel Evaluation Environment. '
15
+ email: peter@ohler.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files:
19
+ - README.md
20
+ files:
21
+ - lib/opee/actor.rb
22
+ - lib/opee/version.rb
23
+ - lib/opee.rb
24
+ - test/tests.rb
25
+ - LICENSE
26
+ - README.md
27
+ homepage: http://www.ohler.com/opee
28
+ licenses: []
29
+ post_install_message:
30
+ rdoc_options:
31
+ - --main
32
+ - README.md
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ requirements: []
48
+ rubyforge_project: opee
49
+ rubygems_version: 1.8.21
50
+ signing_key:
51
+ specification_version: 3
52
+ summary: An experimental Object-base Parallel Evaluation Environment.
53
+ test_files: []
54
+ has_rdoc: true