ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.38
Committed: Fri Aug 7 22:55:18 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.37: +85 -8 lines
Log Message:
spawn

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     AnyEvent::MP - multi-processing/message-passing framework
4    
5     =head1 SYNOPSIS
6    
7     use AnyEvent::MP;
8    
9 root 1.22 $NODE # contains this node's noderef
10     NODE # returns this node's noderef
11     NODE $port # returns the noderef of the port
12 root 1.2
13 root 1.38 $SELF # receiving/own port id in rcv callbacks
14    
15     # ports are message endpoints
16    
17     # sending messages
18 root 1.2 snd $port, type => data...;
19 root 1.38 snd $port, @msg;
20     snd @msg_with_first_element_being_a_port;
21 root 1.2
22 root 1.38 # miniports
23     my $miniport = port { my @msg = @_; 0 };
24 root 1.22
25 root 1.38 # full ports
26     my $port = port;
27     rcv $port, smartmatch => $cb->(@msg);
28     rcv $port, ping => sub { snd $_[0], "pong"; 0 };
29     rcv $port, pong => sub { warn "pong received\n"; 0 };
30 root 1.2
31 root 1.38 # remote ports
32     my $port = spawn $node, $initfunc, @initdata;
33 root 1.2
34     # more, smarter, matches (_any_ is exported by this module)
35     rcv $port, [child_died => $pid] => sub { ...
36     rcv $port, [_any_, _any_, 3] => sub { .. $_[2] is 3
37    
38 root 1.35 # monitoring
39     mon $port, $cb->(@msg) # callback is invoked on death
40     mon $port, $otherport # kill otherport on abnormal death
41     mon $port, $otherport, @msg # send message on death
42    
43 root 1.1 =head1 DESCRIPTION
44    
45 root 1.2 This module (-family) implements a simple message passing framework.
46    
47     Despite its simplicity, you can securely message other processes running
48     on the same or other hosts.
49    
50 root 1.23 For an introduction to this module family, see the L<AnyEvent::MP::Intro>
51     manual page.
52    
53     At the moment, this module family is severly broken and underdocumented,
54 root 1.21 so do not use. This was uploaded mainly to reserve the CPAN namespace -
55 root 1.23 stay tuned! The basic API should be finished, however.
56 root 1.6
57 root 1.2 =head1 CONCEPTS
58    
59     =over 4
60    
61     =item port
62    
63 root 1.29 A port is something you can send messages to (with the C<snd> function).
64    
65     Some ports allow you to register C<rcv> handlers that can match specific
66     messages. All C<rcv> handlers will receive messages they match, messages
67     will not be queued.
68 root 1.2
69 root 1.3 =item port id - C<noderef#portname>
70 root 1.2
71 root 1.29 A port id is normaly the concatenation of a noderef, a hash-mark (C<#>) as
72     separator, and a port name (a printable string of unspecified format). An
73 root 1.30 exception is the the node port, whose ID is identical to its node
74 root 1.29 reference.
75 root 1.2
76     =item node
77    
78     A node is a single process containing at least one port - the node
79 root 1.29 port. You can send messages to node ports to find existing ports or to
80     create new ports, among other things.
81 root 1.2
82 root 1.29 Nodes are either private (single-process only), slaves (connected to a
83     master node only) or public nodes (connectable from unrelated nodes).
84 root 1.2
85 root 1.5 =item noderef - C<host:port,host:port...>, C<id@noderef>, C<id>
86 root 1.2
87 root 1.29 A node reference is a string that either simply identifies the node (for
88     private and slave nodes), or contains a recipe on how to reach a given
89 root 1.2 node (for public nodes).
90    
91 root 1.29 This recipe is simply a comma-separated list of C<address:port> pairs (for
92     TCP/IP, other protocols might look different).
93    
94     Node references come in two flavours: resolved (containing only numerical
95     addresses) or unresolved (where hostnames are used instead of addresses).
96    
97     Before using an unresolved node reference in a message you first have to
98     resolve it.
99    
100 root 1.2 =back
101    
102 root 1.3 =head1 VARIABLES/FUNCTIONS
103 root 1.2
104     =over 4
105    
106 root 1.1 =cut
107    
108     package AnyEvent::MP;
109    
110 root 1.8 use AnyEvent::MP::Base;
111 root 1.2
112 root 1.1 use common::sense;
113    
114 root 1.2 use Carp ();
115    
116 root 1.1 use AE ();
117    
118 root 1.2 use base "Exporter";
119    
120 root 1.25 our $VERSION = '0.1';
121 root 1.8 our @EXPORT = qw(
122 root 1.22 NODE $NODE *SELF node_of _any_
123 root 1.31 resolve_node initialise_node
124 root 1.38 snd rcv mon kil reg psub spawn
125 root 1.22 port
126 root 1.8 );
127 root 1.2
128 root 1.22 our $SELF;
129    
130     sub _self_die() {
131     my $msg = $@;
132     $msg =~ s/\n+$// unless ref $msg;
133     kil $SELF, die => $msg;
134     }
135    
136     =item $thisnode = NODE / $NODE
137    
138     The C<NODE> function returns, and the C<$NODE> variable contains
139     the noderef of the local node. The value is initialised by a call
140     to C<become_public> or C<become_slave>, after which all local port
141     identifiers become invalid.
142    
143 root 1.33 =item $noderef = node_of $port
144 root 1.22
145     Extracts and returns the noderef from a portid or a noderef.
146    
147 root 1.34 =item initialise_node $noderef, $seednode, $seednode...
148    
149     =item initialise_node "slave/", $master, $master...
150    
151     Before a node can talk to other nodes on the network it has to initialise
152     itself - the minimum a node needs to know is it's own name, and optionally
153     it should know the noderefs of some other nodes in the network.
154    
155     This function initialises a node - it must be called exactly once (or
156     never) before calling other AnyEvent::MP functions.
157    
158     All arguments are noderefs, which can be either resolved or unresolved.
159    
160     There are two types of networked nodes, public nodes and slave nodes:
161    
162     =over 4
163    
164     =item public nodes
165    
166     For public nodes, C<$noderef> must either be a (possibly unresolved)
167     noderef, in which case it will be resolved, or C<undef> (or missing), in
168     which case the noderef will be guessed.
169    
170     Afterwards, the node will bind itself on all endpoints and try to connect
171     to all additional C<$seednodes> that are specified. Seednodes are optional
172     and can be used to quickly bootstrap the node into an existing network.
173    
174     =item slave nodes
175    
176     When the C<$noderef> is the special string C<slave/>, then the node will
177     become a slave node. Slave nodes cannot be contacted from outside and will
178     route most of their traffic to the master node that they attach to.
179    
180     At least one additional noderef is required: The node will try to connect
181     to all of them and will become a slave attached to the first node it can
182     successfully connect to.
183    
184     =back
185    
186     This function will block until all nodes have been resolved and, for slave
187     nodes, until it has successfully established a connection to a master
188     server.
189    
190     Example: become a public node listening on the default node.
191    
192     initialise_node;
193    
194     Example: become a public node, and try to contact some well-known master
195     servers to become part of the network.
196    
197     initialise_node undef, "master1", "master2";
198    
199     Example: become a public node listening on port C<4041>.
200    
201     initialise_node 4041;
202    
203     Example: become a public node, only visible on localhost port 4044.
204    
205     initialise_node "locahost:4044";
206    
207     Example: become a slave node to any of the specified master servers.
208    
209     initialise_node "slave/", "master1", "192.168.13.17", "mp.example.net";
210    
211 root 1.29 =item $cv = resolve_node $noderef
212    
213     Takes an unresolved node reference that may contain hostnames and
214     abbreviated IDs, resolves all of them and returns a resolved node
215     reference.
216    
217     In addition to C<address:port> pairs allowed in resolved noderefs, the
218     following forms are supported:
219    
220     =over 4
221    
222     =item the empty string
223    
224     An empty-string component gets resolved as if the default port (4040) was
225     specified.
226    
227     =item naked port numbers (e.g. C<1234>)
228    
229     These are resolved by prepending the local nodename and a colon, to be
230     further resolved.
231    
232     =item hostnames (e.g. C<localhost:1234>, C<localhost>)
233    
234     These are resolved by using AnyEvent::DNS to resolve them, optionally
235     looking up SRV records for the C<aemp=4040> port, if no port was
236     specified.
237    
238     =back
239    
240 root 1.22 =item $SELF
241    
242     Contains the current port id while executing C<rcv> callbacks or C<psub>
243     blocks.
244 root 1.3
245 root 1.22 =item SELF, %SELF, @SELF...
246    
247     Due to some quirks in how perl exports variables, it is impossible to
248     just export C<$SELF>, all the symbols called C<SELF> are exported by this
249     module, but only C<$SELF> is currently used.
250 root 1.3
251 root 1.33 =item snd $port, type => @data
252 root 1.3
253 root 1.33 =item snd $port, @msg
254 root 1.3
255 root 1.8 Send the given message to the given port ID, which can identify either
256     a local or a remote port, and can be either a string or soemthignt hat
257     stringifies a sa port ID (such as a port object :).
258    
259     While the message can be about anything, it is highly recommended to use a
260     string as first element (a portid, or some word that indicates a request
261     type etc.).
262 root 1.3
263     The message data effectively becomes read-only after a call to this
264     function: modifying any argument is not allowed and can cause many
265     problems.
266    
267     The type of data you can transfer depends on the transport protocol: when
268     JSON is used, then only strings, numbers and arrays and hashes consisting
269     of those are allowed (no objects). When Storable is used, then anything
270     that Storable can serialise and deserialise is allowed, and for the local
271     node, anything can be passed.
272    
273 root 1.22 =item $local_port = port
274 root 1.2
275 root 1.31 Create a new local port object that can be used either as a pattern
276     matching port ("full port") or a single-callback port ("miniport"),
277     depending on how C<rcv> callbacks are bound to the object.
278 root 1.3
279 root 1.33 =item $port = port { my @msg = @_; $finished }
280 root 1.10
281 root 1.33 Creates a "miniport", that is, a very lightweight port without any pattern
282     matching behind it, and returns its ID. Semantically the same as creating
283     a port and calling C<rcv $port, $callback> on it.
284 root 1.15
285     The block will be called for every message received on the port. When the
286     callback returns a true value its job is considered "done" and the port
287     will be destroyed. Otherwise it will stay alive.
288    
289 root 1.17 The message will be passed as-is, no extra argument (i.e. no port id) will
290 root 1.15 be passed to the callback.
291    
292     If you need the local port id in the callback, this works nicely:
293    
294 root 1.31 my $port; $port = port {
295 root 1.15 snd $otherport, reply => $port;
296     };
297 root 1.10
298     =cut
299    
300 root 1.33 sub rcv($@);
301    
302 root 1.22 sub port(;&) {
303     my $id = "$UNIQ." . $ID++;
304     my $port = "$NODE#$id";
305    
306     if (@_) {
307 root 1.33 rcv $port, shift;
308 root 1.22 } else {
309 root 1.33 $PORT{$id} = sub { }; # nop
310 root 1.22 }
311 root 1.10
312 root 1.22 $port
313 root 1.10 }
314    
315 root 1.33 =item reg $port, $name
316 root 1.8
317 root 1.36 =item reg $name
318    
319     Registers the given port (or C<$SELF><<< if missing) under the name
320     C<$name>. If the name already exists it is replaced.
321 root 1.8
322 root 1.22 A port can only be registered under one well known name.
323 root 1.8
324 root 1.22 A port automatically becomes unregistered when it is killed.
325 root 1.8
326     =cut
327    
328 root 1.22 sub reg(@) {
329 root 1.36 my $port = @_ > 1 ? shift : $SELF || Carp::croak 'reg: called with one argument only, but $SELF not set,';
330 root 1.8
331 root 1.36 $REG{$_[0]} = $port;
332 root 1.22 }
333 root 1.18
334 root 1.33 =item rcv $port, $callback->(@msg)
335 root 1.31
336 root 1.33 Replaces the callback on the specified miniport (after converting it to
337     one if required).
338 root 1.31
339 root 1.33 =item rcv $port, tagstring => $callback->(@msg), ...
340 root 1.3
341 root 1.33 =item rcv $port, $smartmatch => $callback->(@msg), ...
342 root 1.3
343 root 1.33 =item rcv $port, [$smartmatch...] => $callback->(@msg), ...
344 root 1.3
345 root 1.32 Register callbacks to be called on matching messages on the given full
346 root 1.36 port (after converting it to one if required) and return the port.
347 root 1.3
348     The callback has to return a true value when its work is done, after
349     which is will be removed, or a false value in which case it will stay
350     registered.
351    
352 root 1.33 The global C<$SELF> (exported by this module) contains C<$port> while
353 root 1.22 executing the callback.
354    
355 root 1.38 Runtime errors during callback execution will result in the port being
356 root 1.22 C<kil>ed.
357    
358 root 1.3 If the match is an array reference, then it will be matched against the
359     first elements of the message, otherwise only the first element is being
360     matched.
361    
362     Any element in the match that is specified as C<_any_> (a function
363     exported by this module) matches any single element of the message.
364    
365     While not required, it is highly recommended that the first matching
366     element is a string identifying the message. The one-string-only match is
367     also the most efficient match (by far).
368    
369 root 1.36 Example: create a port and bind receivers on it in one go.
370    
371     my $port = rcv port,
372     msg1 => sub { ...; 0 },
373     msg2 => sub { ...; 0 },
374     ;
375    
376     Example: create a port, bind receivers and send it in a message elsewhere
377     in one go:
378    
379     snd $otherport, reply =>
380     rcv port,
381     msg1 => sub { ...; 0 },
382     ...
383     ;
384    
385 root 1.3 =cut
386    
387     sub rcv($@) {
388 root 1.33 my $port = shift;
389     my ($noderef, $portid) = split /#/, $port, 2;
390 root 1.3
391 root 1.22 ($NODE{$noderef} || add_node $noderef) == $NODE{""}
392 root 1.33 or Carp::croak "$port: rcv can only be called on local ports, caught";
393 root 1.22
394 root 1.33 if (@_ == 1) {
395     my $cb = shift;
396     delete $PORT_DATA{$portid};
397     $PORT{$portid} = sub {
398     local $SELF = $port;
399     eval {
400     &$cb
401     and kil $port;
402     };
403     _self_die if $@;
404     };
405     } else {
406     my $self = $PORT_DATA{$portid} ||= do {
407     my $self = bless {
408     id => $port,
409     }, "AnyEvent::MP::Port";
410    
411     $PORT{$portid} = sub {
412     local $SELF = $port;
413    
414     eval {
415     for (@{ $self->{rc0}{$_[0]} }) {
416     $_ && &{$_->[0]}
417     && undef $_;
418     }
419    
420     for (@{ $self->{rcv}{$_[0]} }) {
421     $_ && [@_[1 .. @{$_->[1]}]] ~~ $_->[1]
422     && &{$_->[0]}
423     && undef $_;
424     }
425    
426     for (@{ $self->{any} }) {
427     $_ && [@_[0 .. $#{$_->[1]}]] ~~ $_->[1]
428     && &{$_->[0]}
429     && undef $_;
430     }
431     };
432     _self_die if $@;
433     };
434    
435     $self
436     };
437 root 1.22
438 root 1.33 "AnyEvent::MP::Port" eq ref $self
439     or Carp::croak "$port: rcv can only be called on message matching ports, caught";
440 root 1.22
441 root 1.33 while (@_) {
442     my ($match, $cb) = splice @_, 0, 2;
443    
444     if (!ref $match) {
445     push @{ $self->{rc0}{$match} }, [$cb];
446     } elsif (("ARRAY" eq ref $match && !ref $match->[0])) {
447     my ($type, @match) = @$match;
448     @match
449     ? push @{ $self->{rcv}{$match->[0]} }, [$cb, \@match]
450     : push @{ $self->{rc0}{$match->[0]} }, [$cb];
451     } else {
452     push @{ $self->{any} }, [$cb, $match];
453     }
454 root 1.22 }
455 root 1.3 }
456 root 1.31
457 root 1.33 $port
458 root 1.2 }
459    
460 root 1.22 =item $closure = psub { BLOCK }
461 root 1.2
462 root 1.22 Remembers C<$SELF> and creates a closure out of the BLOCK. When the
463     closure is executed, sets up the environment in the same way as in C<rcv>
464     callbacks, i.e. runtime errors will cause the port to get C<kil>ed.
465    
466     This is useful when you register callbacks from C<rcv> callbacks:
467    
468     rcv delayed_reply => sub {
469     my ($delay, @reply) = @_;
470     my $timer = AE::timer $delay, 0, psub {
471     snd @reply, $SELF;
472     };
473     };
474 root 1.3
475 root 1.8 =cut
476 root 1.3
477 root 1.22 sub psub(&) {
478     my $cb = shift;
479 root 1.3
480 root 1.22 my $port = $SELF
481     or Carp::croak "psub can only be called from within rcv or psub callbacks, not";
482 root 1.1
483 root 1.22 sub {
484     local $SELF = $port;
485 root 1.2
486 root 1.22 if (wantarray) {
487     my @res = eval { &$cb };
488     _self_die if $@;
489     @res
490     } else {
491     my $res = eval { &$cb };
492     _self_die if $@;
493     $res
494     }
495     }
496 root 1.2 }
497    
498 root 1.33 =item $guard = mon $port, $cb->(@reason)
499 root 1.32
500 root 1.36 =item $guard = mon $port, $rcvport
501    
502     =item $guard = mon $port
503 root 1.32
504 root 1.36 =item $guard = mon $port, $rcvport, @msg
505 root 1.32
506 root 1.36 Monitor the given port and do something when the port is killed, and
507     optionally return a guard that can be used to stop monitoring again.
508 root 1.32
509 root 1.36 In the first form (callback), the callback is simply called with any
510     number of C<@reason> elements (no @reason means that the port was deleted
511 root 1.32 "normally"). Note also that I<< the callback B<must> never die >>, so use
512     C<eval> if unsure.
513    
514 root 1.36 In the second form (another port given), the other port (C<$rcvport)
515     will be C<kil>'ed with C<@reason>, iff a @reason was specified, i.e. on
516     "normal" kils nothing happens, while under all other conditions, the other
517     port is killed with the same reason.
518 root 1.32
519 root 1.36 The third form (kill self) is the same as the second form, except that
520     C<$rvport> defaults to C<$SELF>.
521    
522     In the last form (message), a message of the form C<@msg, @reason> will be
523     C<snd>.
524 root 1.32
525 root 1.37 As a rule of thumb, monitoring requests should always monitor a port from
526     a local port (or callback). The reason is that kill messages might get
527     lost, just like any other message. Another less obvious reason is that
528     even monitoring requests can get lost (for exmaple, when the connection
529     to the other node goes down permanently). When monitoring a port locally
530     these problems do not exist.
531    
532 root 1.32 Example: call a given callback when C<$port> is killed.
533    
534     mon $port, sub { warn "port died because of <@_>\n" };
535    
536     Example: kill ourselves when C<$port> is killed abnormally.
537    
538 root 1.36 mon $port;
539 root 1.32
540 root 1.36 Example: send us a restart message when another C<$port> is killed.
541 root 1.32
542     mon $port, $self => "restart";
543    
544     =cut
545    
546     sub mon {
547     my ($noderef, $port) = split /#/, shift, 2;
548    
549     my $node = $NODE{$noderef} || add_node $noderef;
550    
551 root 1.36 my $cb = @_ ? $_[0] : $SELF || Carp::croak 'mon: called with one argument only, but $SELF not set,';
552 root 1.32
553     unless (ref $cb) {
554     if (@_) {
555     # send a kill info message
556 root 1.36 my (@msg) = @_;
557 root 1.32 $cb = sub { snd @msg, @_ };
558     } else {
559     # simply kill other port
560     my $port = $cb;
561     $cb = sub { kil $port, @_ if @_ };
562     }
563     }
564    
565     $node->monitor ($port, $cb);
566    
567     defined wantarray
568     and AnyEvent::Util::guard { $node->unmonitor ($port, $cb) }
569     }
570    
571     =item $guard = mon_guard $port, $ref, $ref...
572    
573     Monitors the given C<$port> and keeps the passed references. When the port
574     is killed, the references will be freed.
575    
576     Optionally returns a guard that will stop the monitoring.
577    
578     This function is useful when you create e.g. timers or other watchers and
579     want to free them when the port gets killed:
580    
581     $port->rcv (start => sub {
582     my $timer; $timer = mon_guard $port, AE::timer 1, 1, sub {
583     undef $timer if 0.9 < rand;
584     });
585     });
586    
587     =cut
588    
589     sub mon_guard {
590     my ($port, @refs) = @_;
591    
592 root 1.36 #TODO: mon-less form?
593    
594 root 1.32 mon $port, sub { 0 && @refs }
595     }
596    
597 root 1.33 =item kil $port[, @reason]
598 root 1.32
599     Kill the specified port with the given C<@reason>.
600    
601     If no C<@reason> is specified, then the port is killed "normally" (linked
602     ports will not be kileld, or even notified).
603    
604     Otherwise, linked ports get killed with the same reason (second form of
605     C<mon>, see below).
606    
607     Runtime errors while evaluating C<rcv> callbacks or inside C<psub> blocks
608     will be reported as reason C<< die => $@ >>.
609    
610     Transport/communication errors are reported as C<< transport_error =>
611     $message >>.
612    
613 root 1.38 =cut
614    
615     =item $port = spawn $node, $initfunc[, @initdata]
616    
617     Creates a port on the node C<$node> (which can also be a port ID, in which
618     case it's the node where that port resides).
619    
620     The port ID of the newly created port is return immediately, and it is
621     permissible to immediately start sending messages or monitor the port.
622    
623     After the port has been created, the init function is
624     called. This fucntion must be a fully-qualified function name
625     (e.g. C<MyApp::Chat::Server::init>).
626    
627     If the function doesn't exist, then the node tries to C<require>
628     the package, then the package above the package and so on (e.g.
629     C<MyApp::Chat::Server>, C<MyApp::Chat>, C<MyApp>) until the function
630     exists or it runs out of package names.
631    
632     The init function is then called with the newly-created port as context
633     object (C<$SELF>) and the C<@initdata> values as arguments.
634    
635     A common idiom is to pass your own port, monitor the spawned port, and
636     in the init function, monitor the original port. This two-way monitoring
637     ensures that both ports get cleaned up when there is a problem.
638    
639     Example: spawn a chat server port on C<$othernode>.
640    
641     # this node, executed from within a port context:
642     my $server = spawn $othernode, "MyApp::Chat::Server::connect", $SELF;
643     mon $server;
644    
645     # init function on C<$othernode>
646     sub connect {
647     my ($srcport) = @_;
648    
649     mon $srcport;
650    
651     rcv $SELF, sub {
652     ...
653     };
654     }
655    
656     =cut
657    
658     sub _spawn {
659     my $port = shift;
660     my $init = shift;
661    
662     local $SELF = "$NODE#$port";
663     eval {
664     &{ load_func $init }
665     };
666     _self_die if $@;
667     }
668    
669     sub spawn(@) {
670     my ($noderef, undef) = split /#/, shift, 2;
671    
672     my $id = "$RUNIQ." . $ID++;
673    
674     ($NODE{$noderef} || add_node $noderef)
675     ->send (["", "AnyEvent::MP::_spawn" => $id, @_]);
676    
677     "$noderef#$id"
678     }
679    
680 root 1.8 =back
681    
682 root 1.4 =head1 NODE MESSAGES
683    
684 root 1.5 Nodes understand the following messages sent to them. Many of them take
685     arguments called C<@reply>, which will simply be used to compose a reply
686     message - C<$reply[0]> is the port to reply to, C<$reply[1]> the type and
687     the remaining arguments are simply the message data.
688 root 1.4
689 root 1.29 While other messages exist, they are not public and subject to change.
690    
691 root 1.4 =over 4
692    
693     =cut
694    
695 root 1.22 =item lookup => $name, @reply
696 root 1.3
697 root 1.8 Replies with the port ID of the specified well-known port, or C<undef>.
698 root 1.3
699 root 1.7 =item devnull => ...
700    
701     Generic data sink/CPU heat conversion.
702    
703 root 1.4 =item relay => $port, @msg
704    
705     Simply forwards the message to the given port.
706    
707     =item eval => $string[ @reply]
708    
709     Evaluates the given string. If C<@reply> is given, then a message of the
710 root 1.5 form C<@reply, $@, @evalres> is sent.
711    
712     Example: crash another node.
713    
714     snd $othernode, eval => "exit";
715 root 1.4
716     =item time => @reply
717    
718     Replies the the current node time to C<@reply>.
719    
720 root 1.5 Example: tell the current node to send the current time to C<$myport> in a
721     C<timereply> message.
722    
723     snd $NODE, time => $myport, timereply => 1, 2;
724     # => snd $myport, timereply => 1, 2, <time>
725    
726 root 1.2 =back
727    
728 root 1.26 =head1 AnyEvent::MP vs. Distributed Erlang
729    
730 root 1.35 AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node
731     == aemp node, Erlang process == aemp port), so many of the documents and
732     programming techniques employed by Erlang apply to AnyEvent::MP. Here is a
733 root 1.27 sample:
734    
735 root 1.35 http://www.Erlang.se/doc/programming_rules.shtml
736     http://Erlang.org/doc/getting_started/part_frame.html # chapters 3 and 4
737     http://Erlang.org/download/Erlang-book-part1.pdf # chapters 5 and 6
738     http://Erlang.org/download/armstrong_thesis_2003.pdf # chapters 4 and 5
739 root 1.27
740     Despite the similarities, there are also some important differences:
741 root 1.26
742     =over 4
743    
744     =item * Node references contain the recipe on how to contact them.
745    
746     Erlang relies on special naming and DNS to work everywhere in the
747     same way. AEMP relies on each node knowing it's own address(es), with
748     convenience functionality.
749    
750 root 1.27 This means that AEMP requires a less tightly controlled environment at the
751     cost of longer node references and a slightly higher management overhead.
752    
753 root 1.26 =item * Erlang uses processes and a mailbox, AEMP does not queue.
754    
755     Erlang uses processes that selctively receive messages, and therefore
756     needs a queue. AEMP is event based, queuing messages would serve no useful
757     purpose.
758    
759 root 1.35 (But see L<Coro::MP> for a more Erlang-like process model on top of AEMP).
760 root 1.26
761     =item * Erlang sends are synchronous, AEMP sends are asynchronous.
762    
763 root 1.35 Sending messages in Erlang is synchronous and blocks the process. AEMP
764 root 1.26 sends are immediate, connection establishment is handled in the
765     background.
766    
767     =item * Erlang can silently lose messages, AEMP cannot.
768    
769     Erlang makes few guarantees on messages delivery - messages can get lost
770     without any of the processes realising it (i.e. you send messages a, b,
771     and c, and the other side only receives messages a and c).
772    
773     AEMP guarantees correct ordering, and the guarantee that there are no
774     holes in the message sequence.
775    
776 root 1.35 =item * In Erlang, processes can be declared dead and later be found to be
777 root 1.26 alive.
778    
779 root 1.35 In Erlang it can happen that a monitored process is declared dead and
780 root 1.26 linked processes get killed, but later it turns out that the process is
781     still alive - and can receive messages.
782    
783     In AEMP, when port monitoring detects a port as dead, then that port will
784     eventually be killed - it cannot happen that a node detects a port as dead
785     and then later sends messages to it, finding it is still alive.
786    
787     =item * Erlang can send messages to the wrong port, AEMP does not.
788    
789 root 1.35 In Erlang it is quite possible that a node that restarts reuses a process
790 root 1.26 ID known to other nodes for a completely different process, causing
791     messages destined for that process to end up in an unrelated process.
792    
793     AEMP never reuses port IDs, so old messages or old port IDs floating
794     around in the network will not be sent to an unrelated port.
795    
796     =item * Erlang uses unprotected connections, AEMP uses secure
797     authentication and can use TLS.
798    
799     AEMP can use a proven protocol - SSL/TLS - to protect connections and
800     securely authenticate nodes.
801    
802 root 1.28 =item * The AEMP protocol is optimised for both text-based and binary
803     communications.
804    
805 root 1.35 The AEMP protocol, unlike the Erlang protocol, supports both
806 root 1.28 language-independent text-only protocols (good for debugging) and binary,
807     language-specific serialisers (e.g. Storable).
808    
809     It has also been carefully designed to be implementable in other languages
810     with a minimum of work while gracefully degrading fucntionality to make the
811     protocol simple.
812    
813 root 1.35 =item * AEMP has more flexible monitoring options than Erlang.
814    
815     In Erlang, you can chose to receive I<all> exit signals as messages
816     or I<none>, there is no in-between, so monitoring single processes is
817     difficult to implement. Monitoring in AEMP is more flexible than in
818     Erlang, as one can choose between automatic kill, exit message or callback
819     on a per-process basis.
820    
821 root 1.37 =item * Erlang tries to hide remote/local connections, AEMP does not.
822 root 1.35
823     Monitoring in Erlang is not an indicator of process death/crashes,
824 root 1.37 as linking is (except linking is unreliable in Erlang).
825    
826     In AEMP, you don't "look up" registered port names or send to named ports
827     that might or might not be persistent. Instead, you normally spawn a port
828     on the remote node. The init function monitors the you, and you monitor
829     the remote port. Since both monitors are local to the node, they are much
830     more reliable.
831    
832     This also saves round-trips and avoids sending messages to the wrong port
833     (hard to do in Erlang).
834 root 1.35
835 root 1.26 =back
836    
837 root 1.1 =head1 SEE ALSO
838    
839     L<AnyEvent>.
840    
841     =head1 AUTHOR
842    
843     Marc Lehmann <schmorp@schmorp.de>
844     http://home.schmorp.de/
845    
846     =cut
847    
848     1
849