ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.36
Committed: Thu Aug 6 10:46:48 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.35: +60 -18 lines
Log Message:
*** empty log message ***

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