barney 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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