barney 0.1.0 → 0.2.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.
Files changed (5) hide show
  1. data/ChangeLog +8 -0
  2. data/README.md +53 -0
  3. data/lib/barney/share.rb +41 -31
  4. data/lib/barney.rb +1 -1
  5. metadata +45 -5
data/ChangeLog ADDED
@@ -0,0 +1,8 @@
1
+ 2011-01-04 Robert Gleeson <rob@flowof.info> v0.2.0
2
+
3
+ * Alias #synchronize as #sync.
4
+
5
+ 2011-01-03 Robert Gleeson <rob@flowof.info> v0.2.0
6
+
7
+ * Add Barney::Share#unshare.
8
+ * Add Barney::Share#shared.
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ ![Barney Picture](http://ompldr.org/vNnUwNA)
2
+
3
+ Barney tries to make the sharing of data between processes as easy and **natural** as possible.
4
+
5
+ ## Sharable objects
6
+ Behind the scenes, Barney is using Marshal to send data between processes.
7
+ Any object that can be dumped through Marshal.dump can be shared.
8
+ This excludes anonymous modules, anonymous classes, Proc objects, and possibly some other objects I
9
+ cannot think of.
10
+
11
+ ## Thread safety
12
+
13
+ Barney is thread-safe as long as one instance of Barney::Share is used per-thread.
14
+ There is a mutex lock in place, but it only concerns Barney::Share#synchronize, where data is shared
15
+ among all instances of Barney::Share.
16
+
17
+ ## Examples
18
+
19
+ Okay, now that we've got that out of the way, let's see what using Barney is like.
20
+
21
+ **Example A**
22
+
23
+ #!/usr/bin/env ruby
24
+ require 'barney'
25
+
26
+ message = 'foo'
27
+ $times = 2
28
+
29
+ obj = Barney::Share.new
30
+ obj.share :message, :$times
31
+ pid = obj.fork do
32
+ message.sub! 'f', 'b'
33
+ $times += 1
34
+ end
35
+
36
+ Process.wait pid
37
+ obj.sync
38
+
39
+ puts message * $times # output is 'boobooboo'.
40
+
41
+ ### Documentation
42
+
43
+ **API**
44
+
45
+ * [0.2.0](http://rubydoc.info/gems/barney/0.2.0)
46
+ * [0.1.0](http://rubydoc.info/gems/barney/0.1.0)
47
+
48
+ ### Install
49
+
50
+ gem install barney
51
+
52
+ The repository has a gemspec you can build and install from, too.
53
+ I'm following the [Semantic Versioning](http://www.semver.org) policy.
data/lib/barney/share.rb CHANGED
@@ -6,39 +6,49 @@ module Barney
6
6
 
7
7
  class << self
8
8
  # Serves as a temporary holder for the latest value read from the child process.
9
- #
10
- # @api private
9
+ # @api private
11
10
  # @return [void]
12
11
  attr_accessor :value
13
12
 
14
- # Serves as a lock when {Barney::Share.value} is being accessed by {Barney::Share#synchronize}
15
- #
16
- # @api private
13
+ # Serves as a lock when {Barney::Share.value Barney::Share.value} is being accessed by {Barney::Share#synchronize}
14
+ # @api private
17
15
  # @return [Mutex]
18
- def mutex
19
- @mutex
20
- end
16
+ attr_reader :mutex
21
17
  end
22
18
 
19
+ # Returns a list of all variables or constants being shared for this instance of {Barney::Share Barney::Share}.
20
+ # @return [Array<Symbol>]
21
+ attr_reader :shared
22
+ def shared; @shared.keys; end
23
+
23
24
  # @return [Barney::Share] Returns an instance of Barney::Share.
24
25
  def initialize
25
- @shared = []
26
- @communicators = nil
27
- @context = nil
26
+ @shared = Hash.new
27
+ @context = nil
28
28
  end
29
29
 
30
- # The share method marks a variable or constant to be shared between two processes.
31
- #
32
- # @param [Symbol] Variable Accepts a variable amount of Symbol objects.
33
- # @return [Array<Symbol>] Returns a list of all variables that are being shared.
34
- def share(*variables)
35
- @shared = @shared | variables
30
+ # Serves as a method to mark a variable or constant to be shared between two processes.
31
+ # @param [Symbol] Variable Accepts a variable amount of Symbol objects.
32
+ # @return [Array<Symbol>] Returns a list of all variables that are being shared.
33
+ def share *variables
34
+ variables.map(&:to_sym).each do |variable|
35
+ @shared.store variable, IO.pipe
36
+ end
37
+ @shared.keys
36
38
  end
37
39
 
38
- # This method will spawn a new child process.
39
- # It can be treated like the Kernel.fork method, but a block or Proc object is a
40
- # required argument.
41
- #
40
+ # Serves as a method to remove a variable or constant from being shared between two processes.
41
+ # @param [Symbol] Variable Accepts a variable amount of Symbol objects.
42
+ # @return [Array<Symbol>] Returns a list of the variables that are still being shared.
43
+ def unshare *variables
44
+ variables.map(&:to_sym).each do |variable|
45
+ @shared.delete variable
46
+ end
47
+ @shared.keys
48
+ end
49
+
50
+ # Serves as a method to spawn a new child process.
51
+ # It can be treated like the Kernel.fork method, but a block or Proc object is a required argument.
42
52
  # @param [Proc] Proc Accepts a block or Proc object that will be executed in a child
43
53
  # process.
44
54
  #
@@ -46,35 +56,35 @@ module Barney
46
56
  # supplied as an argument.
47
57
  #
48
58
  # @return [Fixnum] Returns the Process ID(PID) of the spawned child process.
49
- def fork(&blk)
50
- raise(ArgumentError, "A block or Proc object is expected") unless block_given?
59
+ def fork &blk
60
+ raise ArgumentError, "A block or Proc object is expected" unless block_given?
51
61
 
52
- @communicators = Array.new(@shared.size) { IO.pipe }
53
62
  @context = blk.binding
54
63
  process_id = Kernel.fork do
55
64
  blk.call
56
- @communicators.each_with_index do |pipes, i|
65
+ @shared.each do |variable, pipes|
57
66
  pipes[0].close
58
- pipes[1].write(Marshal.dump(eval("#{@shared[i]}", @context)))
67
+ pipes[1].write Marshal.dump(eval("#{variable}", @context))
59
68
  pipes[1].close
60
69
  end
61
70
  end
62
71
  process_id
63
72
  end
64
73
 
65
- # This method synchronizes data between the parent and child process.
66
- # This method will block until the spawned child process has exited.
74
+ # Serves as a method that synchronizes data between the parent and child process.
75
+ # It will block until the spawned child process has exited.
67
76
  # @return [void]
68
77
  def synchronize
69
- @communicators.each_with_index do |pipes,i|
78
+ @shared.each do |variable, pipes|
70
79
  Barney::Share.mutex.synchronize do
71
80
  pipes[1].close
72
- Barney::Share.value = Marshal.load(pipes[0].read)
81
+ Barney::Share.value = Marshal.load pipes[0].read
73
82
  pipes[0].close
74
- eval("#{@shared[i]} = Barney::Share.value", @context)
83
+ eval "#{variable} = Barney::Share.value", @context
75
84
  end
76
85
  end
77
86
  end
87
+ alias_method :sync, :synchronize
78
88
 
79
89
  end
80
90
 
data/lib/barney.rb CHANGED
@@ -2,7 +2,7 @@ require('barney/share')
2
2
 
3
3
  module Barney
4
4
 
5
- VERSION = '0.1.0'
5
+ VERSION = '0.2.0'
6
6
 
7
7
  end
8
8
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Robert Gleeson
@@ -14,10 +14,48 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-04 00:00:00 +01:00
17
+ date: 2011-01-04 00:00:00 +00:00
18
18
  default_executable:
19
- dependencies: []
20
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: yard
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :development
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: bluecloth
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: riot
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id003
21
59
  description: Barney tries to make the sharing of data between processes as easy and natural as possible.
22
60
  email: rob@flowof.info
23
61
  executables: []
@@ -27,6 +65,8 @@ extensions: []
27
65
  extra_rdoc_files: []
28
66
 
29
67
  files:
68
+ - README.md
69
+ - ChangeLog
30
70
  - lib/barney.rb
31
71
  - lib/barney/share.rb
32
72
  has_rdoc: true