tribe 0.0.11 → 0.1.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/Gemfile.lock CHANGED
@@ -2,12 +2,12 @@ PATH
2
2
  remote: .
3
3
  specs:
4
4
  tribe (0.0.11)
5
- workers (= 0.0.8)
5
+ workers (= 0.1.1)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- workers (0.0.8)
10
+ workers (0.1.1)
11
11
 
12
12
  PLATFORMS
13
13
  java
data/README.md CHANGED
@@ -90,6 +90,43 @@ In general you shouldn't have to create your own since there is a global one (Tr
90
90
  :name => nil # The name of the actor (must be unique in the registry).
91
91
  )
92
92
 
93
+ ## Timers
94
+
95
+ Actors can create timers to perform some work in the future.
96
+ Both one-shot and periodic timers are provides.
97
+
98
+ class MyActor < Tribe::Actor
99
+ private
100
+ def initialize(options = {})
101
+ super
102
+
103
+ timer(1, :timer, Time.now)
104
+ periodic_timer(1, :periodic_timer, Time.now)
105
+ end
106
+
107
+ def on_timer(event)
108
+ puts "MyActor (#{identifier}) ONE-SHOT: #{event.data}"
109
+ end
110
+
111
+ def on_periodic_timer(event)
112
+ puts "MyActor (#{identifier}) PERIODIC: #{event.data}"
113
+ end
114
+ end
115
+
116
+ # Create some named actors.
117
+ 10.times do |i|
118
+ MyActor.new(:name => "my_actor_#{i}")
119
+ end
120
+
121
+ # Sleep in order to observe the timers.
122
+ sleep 10
123
+
124
+ # Shutdown the actors.
125
+ 10.times do |i|
126
+ actor = Tribe.registry["my_actor_#{i}"]
127
+ actor.enqueue(:shutdown)
128
+ end
129
+
93
130
  ## TODO - missing features
94
131
 
95
132
  - Futures.
data/lib/tribe/actable.rb CHANGED
@@ -7,6 +7,8 @@ module Tribe
7
7
  @dedicated = options[:dedicated] || false
8
8
  @mailbox = options[:mailbox] || Tribe::Mailbox.new
9
9
  @registry = options[:registry] || Tribe.registry
10
+ @scheduler = options[:scheduler] || Workers.scheduler
11
+ @timers = Tribe::SafeSet.new
10
12
  @name = options[:name]
11
13
  @pool = @dedicated ? Workers::Pool.new(:size => 1) : (options[:pool] || Workers.pool)
12
14
  @alive = true
@@ -71,14 +73,53 @@ module Tribe
71
73
  # Override and call super as necessary.
72
74
  def process_event(event)
73
75
  send("on_#{event.command}", event)
76
+
77
+ return nil
74
78
  end
75
79
 
76
80
  # Override and call super as necessary.
77
81
  def exception_handler(e)
82
+ return nil
78
83
  end
79
84
 
80
85
  # Override and call super as necessary.
81
86
  def shutdown_handler(event)
87
+ shutdown_timers
88
+
89
+ return nil
90
+ end
91
+
92
+ def shutdown_timers
93
+ @timers.each do |timer|
94
+ timer.cancel
95
+ end
96
+
97
+ return nil
98
+ end
99
+
100
+ def timer(delay, command, data = nil)
101
+ timer = Workers::Timer.new(delay, :scheduler => @scheduler) do
102
+ @timers.delete(timer)
103
+ enqueue(command, data)
104
+ end
105
+
106
+ @timers.add(timer)
107
+
108
+ return timer
109
+ end
110
+
111
+ def periodic_timer(delay, command, data = nil)
112
+ timer = Workers::PeriodicTimer.new(delay, :scheduler => @scheduler) do
113
+ enqueue(command, data)
114
+ unless alive?
115
+ @timers.delete(timer)
116
+ timer.cancel
117
+ end
118
+ end
119
+
120
+ @timers.add(timer)
121
+
122
+ return timer
82
123
  end
83
124
  end
84
125
  end
@@ -0,0 +1,40 @@
1
+ # Ruby's built in Set class may not be thread safe.
2
+ # This class wraps each method to make it so.
3
+ # More methods will be wrapped as needed.
4
+
5
+ module Tribe
6
+ class SafeSet
7
+ def initialize
8
+ @mutex = Mutex.new
9
+ @set = Set.new
10
+
11
+ return nil
12
+ end
13
+
14
+ def add(item)
15
+ @mutex.synchronize do
16
+ @set.add(item)
17
+ end
18
+
19
+ return self
20
+ end
21
+
22
+ def delete(item)
23
+ @mutex.synchronize do
24
+ @set.delete(item)
25
+ end
26
+
27
+ return self
28
+ end
29
+
30
+ def each(&block)
31
+ @mutex.synchronize do
32
+ @set.each do |item|
33
+ yield(item)
34
+ end
35
+ end
36
+
37
+ return self
38
+ end
39
+ end
40
+ end
data/lib/tribe/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tribe
2
- VERSION = '0.0.11'
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/tribe.rb CHANGED
@@ -1,5 +1,8 @@
1
+ require 'set'
2
+
1
3
  require 'workers'
2
4
 
5
+ require 'tribe/safe_set'
3
6
  require 'tribe/mailbox'
4
7
  require 'tribe/actable'
5
8
  require 'tribe/actor'
data/tribe.gemspec CHANGED
@@ -15,5 +15,5 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Tribe::VERSION
17
17
 
18
- gem.add_dependency('workers', '0.0.8')
18
+ gem.add_dependency('workers', '0.1.1')
19
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tribe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.1.0
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: 2013-02-16 00:00:00.000000000 Z
12
+ date: 2013-05-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: workers
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.0.8
21
+ version: 0.1.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.0.8
29
+ version: 0.1.1
30
30
  description: Tribe is a Ruby gem that implements event-driven actors.
31
31
  email:
32
32
  - chad@remesch.com
@@ -46,6 +46,7 @@ files:
46
46
  - lib/tribe/dedicated_actor.rb
47
47
  - lib/tribe/mailbox.rb
48
48
  - lib/tribe/registry.rb
49
+ - lib/tribe/safe_set.rb
49
50
  - lib/tribe/version.rb
50
51
  - tribe.gemspec
51
52
  homepage: https://github.com/chadrem/tribe