amqp 0.7.0.pre → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +2 -0
  3. data/CHANGELOG +8 -2
  4. data/CONTRIBUTORS +22 -0
  5. data/Gemfile +3 -3
  6. data/README.md +20 -11
  7. data/Rakefile +30 -6
  8. data/amqp.gemspec +1 -1
  9. data/bin/cleanify.rb +50 -0
  10. data/examples/amqp/simple.rb +6 -4
  11. data/examples/mq/ack.rb +8 -6
  12. data/examples/mq/automatic_binding_for_default_direct_exchange.rb +65 -0
  13. data/examples/mq/callbacks.rb +9 -1
  14. data/examples/mq/clock.rb +17 -17
  15. data/examples/mq/hashtable.rb +19 -10
  16. data/examples/mq/internal.rb +13 -11
  17. data/examples/mq/logger.rb +38 -36
  18. data/examples/mq/multiclock.rb +16 -7
  19. data/examples/mq/pingpong.rb +16 -7
  20. data/examples/mq/pop.rb +8 -6
  21. data/examples/mq/primes-simple.rb +2 -0
  22. data/examples/mq/primes.rb +7 -5
  23. data/examples/mq/stocks.rb +14 -5
  24. data/lib/amqp.rb +12 -8
  25. data/lib/amqp/buffer.rb +35 -158
  26. data/lib/amqp/client.rb +34 -22
  27. data/lib/amqp/frame.rb +8 -64
  28. data/lib/amqp/protocol.rb +21 -70
  29. data/lib/amqp/server.rb +11 -9
  30. data/lib/amqp/spec.rb +8 -6
  31. data/lib/amqp/version.rb +2 -0
  32. data/lib/ext/blankslate.rb +3 -1
  33. data/lib/ext/em.rb +2 -0
  34. data/lib/ext/emfork.rb +13 -11
  35. data/lib/mq.rb +253 -156
  36. data/lib/mq/collection.rb +6 -88
  37. data/lib/mq/exchange.rb +70 -13
  38. data/lib/mq/header.rb +12 -6
  39. data/lib/mq/logger.rb +9 -7
  40. data/lib/mq/queue.rb +42 -30
  41. data/lib/mq/rpc.rb +6 -4
  42. data/protocol/codegen.rb +20 -18
  43. data/research/api.rb +10 -46
  44. data/research/primes-forked.rb +9 -7
  45. data/research/primes-processes.rb +74 -72
  46. data/research/primes-threaded.rb +9 -7
  47. data/spec/integration/automatic_binding_for_default_direct_exchange_spec.rb +61 -0
  48. data/spec/mq_helper.rb +70 -0
  49. data/spec/spec_helper.rb +84 -29
  50. data/spec/unit/amqp/buffer_spec.rb +178 -0
  51. data/spec/unit/amqp/client_spec.rb +472 -0
  52. data/spec/unit/amqp/frame_spec.rb +60 -0
  53. data/spec/unit/amqp/misc_spec.rb +123 -0
  54. data/spec/unit/amqp/protocol_spec.rb +53 -0
  55. data/spec/unit/mq/channel_close_spec.rb +15 -0
  56. data/spec/unit/mq/collection_spec.rb +129 -0
  57. data/spec/unit/mq/exchange_declaration_spec.rb +524 -0
  58. data/spec/unit/mq/misc_spec.rb +228 -0
  59. data/spec/unit/mq/mq_basic_spec.rb +39 -0
  60. data/spec/unit/mq/queue_declaration_spec.rb +97 -0
  61. data/spec/unit/mq/queue_spec.rb +71 -0
  62. metadata +33 -21
  63. data/Gemfile.lock +0 -16
  64. data/old/README +0 -30
  65. data/old/Rakefile +0 -12
  66. data/old/amqp-0.8.json +0 -606
  67. data/old/amqp_spec.rb +0 -796
  68. data/old/amqpc.rb +0 -695
  69. data/old/codegen.rb +0 -148
  70. data/spec/channel_close_spec.rb +0 -13
  71. data/spec/sync_async_spec.rb +0 -52
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  class MQ
2
4
  # Basic RPC (remote procedure call) facility.
3
5
  #
@@ -40,7 +42,7 @@ class MQ
40
42
  # there is a valid destination. Failure to do so will just enqueue
41
43
  # marshalled messages that are never consumed.
42
44
  #
43
- def initialize mq, queue, obj = nil
45
+ def initialize(mq, queue, obj = nil)
44
46
  @mq = mq
45
47
  @mq.rpcs[queue] ||= self
46
48
 
@@ -54,7 +56,7 @@ class MQ
54
56
  obj
55
57
  end
56
58
 
57
- @mq.queue(queue).subscribe(:ack=>true){ |info, request|
59
+ @mq.queue(queue).subscribe(:ack => true) { |info, request|
58
60
  method, *args = ::Marshal.load(request)
59
61
  ret = @obj.__send__(method, *args)
60
62
 
@@ -67,7 +69,7 @@ class MQ
67
69
  else
68
70
  @callbacks ||= {}
69
71
  # XXX implement and use queue(nil)
70
- @queue = @mq.queue(@name = "random identifier #{::Kernel.rand(999_999_999_999)}", :auto_delete => true).subscribe{|info, msg|
72
+ @queue = @mq.queue(@name = "random identifier #{::Kernel.rand(999_999_999_999)}", :auto_delete => true).subscribe { |info, msg|
71
73
  if blk = @callbacks.delete(info.message_id)
72
74
  blk.call ::Marshal.load(msg)
73
75
  end
@@ -90,7 +92,7 @@ class MQ
90
92
  # ....
91
93
  # end
92
94
  #
93
- def method_missing meth, *args, &blk
95
+ def method_missing(meth, *args, &blk)
94
96
  # XXX use uuids instead
95
97
  message_id = "random message id #{::Kernel.rand(999_999_999_999)}"
96
98
  @callbacks[message_id] = blk if blk
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'rubygems'
2
4
  require 'json'
3
5
 
@@ -40,21 +42,21 @@ puts ERB.new(%q[
40
42
  end
41
43
  end
42
44
 
43
- <%- s['constants'].select{|c| (1..8).include? c['value'] }.each do |c| -%>
44
- class <%= c['name'].gsub(/^FRAME-/,'').split('-').map{|w| w.downcase.capitalize}.join.ljust(9) -%> < Frame( <%= c['value'] -%> ); end
45
+ <%- s['constants'].select { |c| (1..8).include? c['value'] }.each do |c| -%>
46
+ class <%= c['name'].gsub(/^FRAME-/, '').split('-').map { |w| w.downcase.capitalize}.join.ljust(9) -%> < Frame( <%= c['value'] -%> ); end
45
47
  <%- end -%>
46
48
 
47
- FOOTER = <%= frame_end = s['constants'].find{|c| c['name'] == 'FRAME-END' }['value'] %>
49
+ FOOTER = <%= frame_end = s['constants'].find { |c| c['name'] == 'FRAME-END' }['value'] %>
48
50
  end
49
51
 
50
52
  RESPONSES = {
51
- <%- s['constants'].select{|c| c['value'] != frame_end and (200..500).include? c['value'] }.each do |c| -%>
52
- <%= c['value'] %> => :<%= c['name'].tr('-', '_').gsub(/^FRAME_/,'').upcase -%>,
53
+ <%- s['constants'].select { |c| c['value'] != frame_end and (200..500).include? c['value'] }.each do |c| -%>
54
+ <%= c['value'] %> => :<%= c['name'].tr('-', '_').gsub(/^FRAME_/, '').upcase -%>,
53
55
  <%- end -%>
54
56
  }
55
57
 
56
58
  FIELDS = [
57
- <%- s['domains'].select{|d| d.first == d.last }.each do |d| -%>
59
+ <%- s['domains'].select { |d| d.first == d.last }.each do |d| -%>
58
60
  :<%= d.first -%>,
59
61
  <%- end -%>
60
62
  ]
@@ -70,7 +72,7 @@ puts ERB.new(%q[
70
72
  end
71
73
  ]
72
74
  end
73
-
75
+
74
76
  def properties() @properties ||= [] end
75
77
 
76
78
  def id() self::ID end
@@ -87,10 +89,10 @@ puts ERB.new(%q[
87
89
  end
88
90
  ]
89
91
  end
90
-
92
+
91
93
  def arguments() @arguments ||= [] end
92
94
 
93
- def section() Protocol.const_get(self.to_s[/Protocol::(.+?)::/,1]) end
95
+ def section() Protocol.const_get(self.to_s[/Protocol::(.+?)::/, 1]) end
94
96
  def id() self::ID end
95
97
  def name() self::NAME end
96
98
  end
@@ -101,9 +103,9 @@ puts ERB.new(%q[
101
103
  end
102
104
  end
103
105
  end
104
-
106
+
105
107
  def self.methods() @methods ||= {} end
106
-
108
+
107
109
  def self.Method(id, name)
108
110
  @_base_methods ||= {}
109
111
  @_base_methods[id] ||= ::Class.new(Method) do
@@ -136,7 +138,7 @@ puts ERB.new(%q[
136
138
  end
137
139
  end
138
140
  end
139
-
141
+
140
142
  module AMQP
141
143
  module Protocol
142
144
  <%- s['classes'].each do |c| -%>
@@ -146,20 +148,20 @@ puts ERB.new(%q[
146
148
  <%- s['classes'].each do |c| -%>
147
149
  class <%= c['name'].capitalize %>
148
150
  <%- c['properties'].each do |p| -%>
149
- <%= p['type'].ljust(10) %> :<%= p['name'].tr('-','_') %>
151
+ <%= p['type'].ljust(10) %> :<%= p['name'].tr('-', '_') %>
150
152
  <%- end if c['properties'] -%>
151
153
 
152
154
  <%- c['methods'].each do |m| -%>
153
- class <%= m['name'].capitalize.gsub(/-(.)/){ "#{$1.upcase}"}.ljust(12) %> < Method( <%= m['id'].to_s.rjust(3) %>, :<%= m['name'].tr('- ','_').ljust(14) %> ); end
155
+ class <%= m['name'].capitalize.gsub(/-(.)/) { "#{$1.upcase}"}.ljust(12) %> < Method( <%= m['id'].to_s.rjust(3) %>, :<%= m['name'].tr('- ', '_').ljust(14) %> ); end
154
156
  <%- end -%>
155
157
 
156
158
  <%- c['methods'].each do |m| -%>
157
- class <%= m['name'].capitalize.gsub(/-(.)/){ "#{$1.upcase}"} %>
159
+ class <%= m['name'].capitalize.gsub(/-(.)/) { "#{$1.upcase}"} %>
158
160
  <%- m['arguments'].each do |a| -%>
159
161
  <%- if a['domain'] -%>
160
- <%= s['domains'].find{|k,v| k == a['domain']}.last.ljust(10) %> :<%= a['name'].tr('- ','_') %>
162
+ <%= s['domains'].find { |k, v| k == a['domain']}.last.ljust(10) %> :<%= a['name'].tr('- ', '_') %>
161
163
  <%- else -%>
162
- <%= a['type'].ljust(10) %> :<%= a['name'].tr('- ','_') %>
164
+ <%= a['type'].ljust(10) %> :<%= a['name'].tr('- ', '_') %>
163
165
  <%- end -%>
164
166
  <%- end if m['arguments'] -%>
165
167
  end
@@ -170,4 +172,4 @@ puts ERB.new(%q[
170
172
  <%- end -%>
171
173
  end
172
174
  end
173
- ].gsub!(/^ /,''), nil, '>-%').result(binding)
175
+ ].gsub!(/^ /, ''), nil, '>-%').result(binding)
@@ -1,17 +1,19 @@
1
+ # encoding: utf-8
2
+
1
3
  $:.unshift File.dirname(__FILE__) + '/../lib'
2
4
  require 'rubygems'
3
5
  require 'amqp'
4
6
 
5
7
  # AMQP.start do |amqp|
6
8
  # amqp.channel!(1)
7
- #
9
+ #
8
10
  # q = amqp.queue.declare(:queue => 'test',
9
11
  # :exclusive => false,
10
12
  # :auto_delete => true)
11
- #
13
+ #
12
14
  # q.bind(:exchange => '',
13
15
  # :routing_key => 'test_route')
14
- #
16
+ #
15
17
  # amqp.basic.consume(:queue => q,
16
18
  # :no_local => false,
17
19
  # :no_ack => true) { |header, body|
@@ -23,7 +25,7 @@ AMQP.start do |amqp|
23
25
  amqp.exchange('my_exchange', :topic) do |e|
24
26
  e.publish(routing_key, data, :header => 'blah')
25
27
  end
26
-
28
+
27
29
  amqp.queue('my_queue').subscribe do |header, body|
28
30
  p ['got', header, body]
29
31
  end
@@ -40,49 +42,11 @@ mq.topic('test').publish('some data', :key => 'stock.usd.*')
40
42
 
41
43
  # amq.queue('user1').bind(amq.topic('conversation.1'))
42
44
 
43
- mq.queue('abc').get{}
44
- mq.queue('abc').peek{}
45
- mq.queue('abc').subscribe{ |body|
46
-
45
+ mq.queue('abc').get {}
46
+ mq.queue('abc').peek {}
47
+ mq.queue('abc').subscribe { |body|
48
+
47
49
  }
48
50
 
49
51
  mq.queue('abc').bind(:exchange => mq.topic, :routing_key => 'abc', :nowait => true, :arguments => {})
50
52
 
51
- if $0 =~ /bacon/ or __FILE__ == $0
52
- require 'bacon'
53
-
54
- describe MQ do
55
- before do
56
- @mq = MQ.new
57
- end
58
-
59
- should 'have a channel' do
60
- @mq.channel.should.be.kind_of? Fixnum
61
- @mq.channel.should == 1
62
- end
63
-
64
- should 'give each thread a message queue' do
65
- class MQ
66
- @@cur_channel = 0
67
- end
68
- MQ.channel.should == 1
69
- Thread.new{ MQ.channel }.value.should == 2
70
- Thread.new{ MQ.channel }.value.should == 3
71
- end
72
-
73
- should 'create direct exchanges' do
74
- @mq.direct.name.should == 'amq.direct'
75
- @mq.direct(nil).name.should =~ /^\d+$/
76
- @mq.direct('name').name.should == 'name'
77
- end
78
-
79
- should 'create fanout and topic exchanges' do
80
- @mq.fanout.name.should == 'amq.fanout'
81
- @mq.topic.name.should == 'amq.topic'
82
- end
83
-
84
- should 'create queues' do
85
- q = @mq.queue('test')
86
- end
87
- end
88
- end
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  $:.unshift File.dirname(__FILE__) + '/../lib'
2
4
  require 'mq'
3
5
 
@@ -7,8 +9,8 @@ def EM.fork &blk
7
9
  raise if reactor_running?
8
10
 
9
11
  unless @forks
10
- at_exit{
11
- @forks.each{ |pid| Process.kill('KILL', pid) }
12
+ at_exit {
13
+ @forks.each { |pid| Process.kill('KILL', pid) }
12
14
  }
13
15
  end
14
16
 
@@ -17,7 +19,7 @@ def EM.fork &blk
17
19
  end
18
20
  end
19
21
 
20
- def log *args
22
+ def log(*args)
21
23
  p args
22
24
  end
23
25
 
@@ -28,7 +30,7 @@ end
28
30
  workers = ARGV[0] ? (Integer(ARGV[0]) rescue 2) : 2
29
31
 
30
32
  workers.times do
31
- EM.fork{
33
+ EM.fork {
32
34
  log "prime checker", Process.pid, :started
33
35
 
34
36
  class Fixnum
@@ -37,7 +39,7 @@ end
37
39
  end
38
40
  end
39
41
 
40
- MQ.queue('prime checker').subscribe{ |info, num|
42
+ MQ.queue('prime checker').subscribe { |info, num|
41
43
  log "prime checker #{Process.pid}", :prime?, num
42
44
  if Integer(num).prime?
43
45
  MQ.queue(info.reply_to).publish(num, :reply_to => Process.pid)
@@ -48,8 +50,8 @@ end
48
50
 
49
51
  # controller
50
52
 
51
- EM.run{
52
- MQ.queue('prime collector').subscribe{ |info, prime|
53
+ EM.run {
54
+ MQ.queue('prime collector').subscribe { |info, prime|
53
55
  log 'prime collector', :received, prime, :from, info.reply_to
54
56
  (@primes ||= []) << Integer(prime)
55
57
  EM.stop_event_loop if prime == '499'
@@ -1,11 +1,13 @@
1
+ # encoding: utf-8
2
+
1
3
  $:.unshift File.dirname(__FILE__) + '/../lib'
2
4
  require 'mq'
3
5
 
4
6
  MAX = 500
5
7
 
6
- EM.run{
8
+ EM.run {
7
9
 
8
- def log *args
10
+ def log(*args)
9
11
  p args
10
12
  end
11
13
 
@@ -21,7 +23,7 @@ EM.run{
21
23
  end
22
24
  end
23
25
 
24
- MQ.queue('prime checker').subscribe{ |info, num|
26
+ MQ.queue('prime checker').subscribe { |info, num|
25
27
  log "prime checker #{Process.pid}", :prime?, num
26
28
  if Integer(num).prime?
27
29
  MQ.queue(info.reply_to).publish(num, :reply_to => Process.pid)
@@ -31,7 +33,7 @@ EM.run{
31
33
 
32
34
  elsif ARGV[0] == 'controller'
33
35
 
34
- MQ.queue('prime collector').subscribe{ |info, prime|
36
+ MQ.queue('prime collector').subscribe { |info, prime|
35
37
  log 'prime collector', :received, prime, :from, info.reply_to
36
38
  (@primes ||= []) << Integer(prime)
37
39
  }
@@ -65,71 +67,71 @@ EM.run{
65
67
 
66
68
  __END__
67
69
 
68
- ["prime checker", :started, {:pid=>1958}]
69
- ["prime checker", :started, {:pid=>1957}]
70
- ["prime checker", :started, {:pid=>1956}]
71
- ["prime checker", :prime?, "1", {:pid=>1958}]
72
- ["prime checker", :prime?, "2", {:pid=>1957}]
73
- ["prime collector", :received, "2", {:from_pid=>"1957"}]
74
- ["prime checker", :prime?, "3", {:pid=>1956}]
75
- ["prime collector", :received, "3", {:from_pid=>"1956"}]
76
- ["prime checker", :prime?, "4", {:pid=>1958}]
77
- ["prime checker", :prime?, "5", {:pid=>1957}]
78
- ["prime collector", :received, "5", {:from_pid=>"1957"}]
79
- ["prime checker", :prime?, "6", {:pid=>1956}]
80
- ["prime checker", :prime?, "7", {:pid=>1958}]
81
- ["prime collector", :received, "7", {:from_pid=>"1958"}]
82
- ["prime checker", :prime?, "8", {:pid=>1957}]
83
- ["prime checker", :prime?, "9", {:pid=>1956}]
84
- ["prime checker", :prime?, "10", {:pid=>1958}]
85
- ["prime checker", :prime?, "11", {:pid=>1957}]
86
- ["prime collector", :received, "11", {:from_pid=>"1957"}]
87
- ["prime checker", :prime?, "12", {:pid=>1956}]
88
- ["prime checker", :prime?, "13", {:pid=>1958}]
89
- ["prime collector", :received, "13", {:from_pid=>"1958"}]
90
- ["prime checker", :prime?, "14", {:pid=>1957}]
91
- ["prime checker", :prime?, "15", {:pid=>1956}]
92
- ["prime checker", :prime?, "16", {:pid=>1958}]
93
- ["prime checker", :prime?, "17", {:pid=>1957}]
94
- ["prime collector", :received, "17", {:from_pid=>"1957"}]
95
- ["prime checker", :prime?, "18", {:pid=>1956}]
96
- ["prime checker", :prime?, "19", {:pid=>1958}]
97
- ["prime collector", :received, "19", {:from_pid=>"1958"}]
98
- ["prime checker", :prime?, "20", {:pid=>1957}]
99
- ["prime checker", :prime?, "21", {:pid=>1956}]
100
- ["prime checker", :prime?, "22", {:pid=>1958}]
101
- ["prime checker", :prime?, "23", {:pid=>1957}]
102
- ["prime collector", :received, "23", {:from_pid=>"1957"}]
103
- ["prime checker", :prime?, "24", {:pid=>1956}]
104
- ["prime checker", :prime?, "25", {:pid=>1958}]
105
- ["prime checker", :prime?, "26", {:pid=>1957}]
106
- ["prime checker", :prime?, "27", {:pid=>1956}]
107
- ["prime checker", :prime?, "28", {:pid=>1958}]
108
- ["prime checker", :prime?, "29", {:pid=>1957}]
109
- ["prime collector", :received, "29", {:from_pid=>"1957"}]
110
- ["prime checker", :prime?, "30", {:pid=>1956}]
111
- ["prime checker", :prime?, "31", {:pid=>1958}]
112
- ["prime collector", :received, "31", {:from_pid=>"1958"}]
113
- ["prime checker", :prime?, "32", {:pid=>1957}]
114
- ["prime checker", :prime?, "33", {:pid=>1956}]
115
- ["prime checker", :prime?, "34", {:pid=>1958}]
116
- ["prime checker", :prime?, "35", {:pid=>1957}]
117
- ["prime checker", :prime?, "36", {:pid=>1956}]
118
- ["prime checker", :prime?, "37", {:pid=>1958}]
119
- ["prime collector", :received, "37", {:from_pid=>"1958"}]
120
- ["prime checker", :prime?, "38", {:pid=>1957}]
121
- ["prime checker", :prime?, "39", {:pid=>1956}]
122
- ["prime checker", :prime?, "40", {:pid=>1958}]
123
- ["prime checker", :prime?, "41", {:pid=>1957}]
124
- ["prime collector", :received, "41", {:from_pid=>"1957"}]
125
- ["prime checker", :prime?, "42", {:pid=>1956}]
126
- ["prime checker", :prime?, "43", {:pid=>1958}]
127
- ["prime collector", :received, "43", {:from_pid=>"1958"}]
128
- ["prime checker", :prime?, "44", {:pid=>1957}]
129
- ["prime checker", :prime?, "45", {:pid=>1956}]
130
- ["prime checker", :prime?, "46", {:pid=>1958}]
131
- ["prime checker", :prime?, "47", {:pid=>1957}]
132
- ["prime collector", :received, "47", {:from_pid=>"1957"}]
133
- ["prime checker", :prime?, "48", {:pid=>1956}]
134
- ["prime checker", :prime?, "49", {:pid=>1958}]
135
- ["prime checker", :prime?, "50", {:pid=>1957}]
70
+ ["prime checker", :started, {:pid => 1958}]
71
+ ["prime checker", :started, {:pid => 1957}]
72
+ ["prime checker", :started, {:pid => 1956}]
73
+ ["prime checker", :prime?, "1", {:pid => 1958}]
74
+ ["prime checker", :prime?, "2", {:pid => 1957}]
75
+ ["prime collector", :received, "2", {:from_pid => "1957"}]
76
+ ["prime checker", :prime?, "3", {:pid => 1956}]
77
+ ["prime collector", :received, "3", {:from_pid => "1956"}]
78
+ ["prime checker", :prime?, "4", {:pid => 1958}]
79
+ ["prime checker", :prime?, "5", {:pid => 1957}]
80
+ ["prime collector", :received, "5", {:from_pid => "1957"}]
81
+ ["prime checker", :prime?, "6", {:pid => 1956}]
82
+ ["prime checker", :prime?, "7", {:pid => 1958}]
83
+ ["prime collector", :received, "7", {:from_pid => "1958"}]
84
+ ["prime checker", :prime?, "8", {:pid => 1957}]
85
+ ["prime checker", :prime?, "9", {:pid => 1956}]
86
+ ["prime checker", :prime?, "10", {:pid => 1958}]
87
+ ["prime checker", :prime?, "11", {:pid => 1957}]
88
+ ["prime collector", :received, "11", {:from_pid => "1957"}]
89
+ ["prime checker", :prime?, "12", {:pid => 1956}]
90
+ ["prime checker", :prime?, "13", {:pid => 1958}]
91
+ ["prime collector", :received, "13", {:from_pid => "1958"}]
92
+ ["prime checker", :prime?, "14", {:pid => 1957}]
93
+ ["prime checker", :prime?, "15", {:pid => 1956}]
94
+ ["prime checker", :prime?, "16", {:pid => 1958}]
95
+ ["prime checker", :prime?, "17", {:pid => 1957}]
96
+ ["prime collector", :received, "17", {:from_pid => "1957"}]
97
+ ["prime checker", :prime?, "18", {:pid => 1956}]
98
+ ["prime checker", :prime?, "19", {:pid => 1958}]
99
+ ["prime collector", :received, "19", {:from_pid => "1958"}]
100
+ ["prime checker", :prime?, "20", {:pid => 1957}]
101
+ ["prime checker", :prime?, "21", {:pid => 1956}]
102
+ ["prime checker", :prime?, "22", {:pid => 1958}]
103
+ ["prime checker", :prime?, "23", {:pid => 1957}]
104
+ ["prime collector", :received, "23", {:from_pid => "1957"}]
105
+ ["prime checker", :prime?, "24", {:pid => 1956}]
106
+ ["prime checker", :prime?, "25", {:pid => 1958}]
107
+ ["prime checker", :prime?, "26", {:pid => 1957}]
108
+ ["prime checker", :prime?, "27", {:pid => 1956}]
109
+ ["prime checker", :prime?, "28", {:pid => 1958}]
110
+ ["prime checker", :prime?, "29", {:pid => 1957}]
111
+ ["prime collector", :received, "29", {:from_pid => "1957"}]
112
+ ["prime checker", :prime?, "30", {:pid => 1956}]
113
+ ["prime checker", :prime?, "31", {:pid => 1958}]
114
+ ["prime collector", :received, "31", {:from_pid => "1958"}]
115
+ ["prime checker", :prime?, "32", {:pid => 1957}]
116
+ ["prime checker", :prime?, "33", {:pid => 1956}]
117
+ ["prime checker", :prime?, "34", {:pid => 1958}]
118
+ ["prime checker", :prime?, "35", {:pid => 1957}]
119
+ ["prime checker", :prime?, "36", {:pid => 1956}]
120
+ ["prime checker", :prime?, "37", {:pid => 1958}]
121
+ ["prime collector", :received, "37", {:from_pid => "1958"}]
122
+ ["prime checker", :prime?, "38", {:pid => 1957}]
123
+ ["prime checker", :prime?, "39", {:pid => 1956}]
124
+ ["prime checker", :prime?, "40", {:pid => 1958}]
125
+ ["prime checker", :prime?, "41", {:pid => 1957}]
126
+ ["prime collector", :received, "41", {:from_pid => "1957"}]
127
+ ["prime checker", :prime?, "42", {:pid => 1956}]
128
+ ["prime checker", :prime?, "43", {:pid => 1958}]
129
+ ["prime collector", :received, "43", {:from_pid => "1958"}]
130
+ ["prime checker", :prime?, "44", {:pid => 1957}]
131
+ ["prime checker", :prime?, "45", {:pid => 1956}]
132
+ ["prime checker", :prime?, "46", {:pid => 1958}]
133
+ ["prime checker", :prime?, "47", {:pid => 1957}]
134
+ ["prime collector", :received, "47", {:from_pid => "1957"}]
135
+ ["prime checker", :prime?, "48", {:pid => 1956}]
136
+ ["prime checker", :prime?, "49", {:pid => 1958}]
137
+ ["prime checker", :prime?, "50", {:pid => 1957}]