ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.35
Committed: Thu Aug 6 10:21:48 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.34: +36 -13 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.22 Registers the given port under the name C<$name>. If the name already
311     exists it is replaced.
312 root 1.8
313 root 1.22 A port can only be registered under one well known name.
314 root 1.8
315 root 1.22 A port automatically becomes unregistered when it is killed.
316 root 1.8
317     =cut
318    
319 root 1.22 sub reg(@) {
320 root 1.33 my ($port, $name) = @_;
321 root 1.8
322 root 1.33 $REG{$name} = $port;
323 root 1.22 }
324 root 1.18
325 root 1.33 =item rcv $port, $callback->(@msg)
326 root 1.31
327 root 1.33 Replaces the callback on the specified miniport (after converting it to
328     one if required).
329 root 1.31
330 root 1.33 =item rcv $port, tagstring => $callback->(@msg), ...
331 root 1.3
332 root 1.33 =item rcv $port, $smartmatch => $callback->(@msg), ...
333 root 1.3
334 root 1.33 =item rcv $port, [$smartmatch...] => $callback->(@msg), ...
335 root 1.3
336 root 1.32 Register callbacks to be called on matching messages on the given full
337 root 1.33 port (after converting it to one if required).
338 root 1.3
339     The callback has to return a true value when its work is done, after
340     which is will be removed, or a false value in which case it will stay
341     registered.
342    
343 root 1.33 The global C<$SELF> (exported by this module) contains C<$port> while
344 root 1.22 executing the callback.
345    
346     Runtime errors wdurign callback execution will result in the port being
347     C<kil>ed.
348    
349 root 1.3 If the match is an array reference, then it will be matched against the
350     first elements of the message, otherwise only the first element is being
351     matched.
352    
353     Any element in the match that is specified as C<_any_> (a function
354     exported by this module) matches any single element of the message.
355    
356     While not required, it is highly recommended that the first matching
357     element is a string identifying the message. The one-string-only match is
358     also the most efficient match (by far).
359    
360     =cut
361    
362     sub rcv($@) {
363 root 1.33 my $port = shift;
364     my ($noderef, $portid) = split /#/, $port, 2;
365 root 1.3
366 root 1.22 ($NODE{$noderef} || add_node $noderef) == $NODE{""}
367 root 1.33 or Carp::croak "$port: rcv can only be called on local ports, caught";
368 root 1.22
369 root 1.33 if (@_ == 1) {
370     my $cb = shift;
371     delete $PORT_DATA{$portid};
372     $PORT{$portid} = sub {
373     local $SELF = $port;
374     eval {
375     &$cb
376     and kil $port;
377     };
378     _self_die if $@;
379     };
380     } else {
381     my $self = $PORT_DATA{$portid} ||= do {
382     my $self = bless {
383     id => $port,
384     }, "AnyEvent::MP::Port";
385    
386     $PORT{$portid} = sub {
387     local $SELF = $port;
388    
389     eval {
390     for (@{ $self->{rc0}{$_[0]} }) {
391     $_ && &{$_->[0]}
392     && undef $_;
393     }
394    
395     for (@{ $self->{rcv}{$_[0]} }) {
396     $_ && [@_[1 .. @{$_->[1]}]] ~~ $_->[1]
397     && &{$_->[0]}
398     && undef $_;
399     }
400    
401     for (@{ $self->{any} }) {
402     $_ && [@_[0 .. $#{$_->[1]}]] ~~ $_->[1]
403     && &{$_->[0]}
404     && undef $_;
405     }
406     };
407     _self_die if $@;
408     };
409    
410     $self
411     };
412 root 1.22
413 root 1.33 "AnyEvent::MP::Port" eq ref $self
414     or Carp::croak "$port: rcv can only be called on message matching ports, caught";
415 root 1.22
416 root 1.33 while (@_) {
417     my ($match, $cb) = splice @_, 0, 2;
418    
419     if (!ref $match) {
420     push @{ $self->{rc0}{$match} }, [$cb];
421     } elsif (("ARRAY" eq ref $match && !ref $match->[0])) {
422     my ($type, @match) = @$match;
423     @match
424     ? push @{ $self->{rcv}{$match->[0]} }, [$cb, \@match]
425     : push @{ $self->{rc0}{$match->[0]} }, [$cb];
426     } else {
427     push @{ $self->{any} }, [$cb, $match];
428     }
429 root 1.22 }
430 root 1.3 }
431 root 1.31
432 root 1.33 $port
433 root 1.2 }
434    
435 root 1.22 =item $closure = psub { BLOCK }
436 root 1.2
437 root 1.22 Remembers C<$SELF> and creates a closure out of the BLOCK. When the
438     closure is executed, sets up the environment in the same way as in C<rcv>
439     callbacks, i.e. runtime errors will cause the port to get C<kil>ed.
440    
441     This is useful when you register callbacks from C<rcv> callbacks:
442    
443     rcv delayed_reply => sub {
444     my ($delay, @reply) = @_;
445     my $timer = AE::timer $delay, 0, psub {
446     snd @reply, $SELF;
447     };
448     };
449 root 1.3
450 root 1.8 =cut
451 root 1.3
452 root 1.22 sub psub(&) {
453     my $cb = shift;
454 root 1.3
455 root 1.22 my $port = $SELF
456     or Carp::croak "psub can only be called from within rcv or psub callbacks, not";
457 root 1.1
458 root 1.22 sub {
459     local $SELF = $port;
460 root 1.2
461 root 1.22 if (wantarray) {
462     my @res = eval { &$cb };
463     _self_die if $@;
464     @res
465     } else {
466     my $res = eval { &$cb };
467     _self_die if $@;
468     $res
469     }
470     }
471 root 1.2 }
472    
473 root 1.33 =item $guard = mon $port, $cb->(@reason)
474 root 1.32
475 root 1.33 =item $guard = mon $port, $otherport
476 root 1.32
477 root 1.33 =item $guard = mon $port, $otherport, @msg
478 root 1.32
479     Monitor the given port and do something when the port is killed.
480    
481     In the first form, the callback is simply called with any number
482     of C<@reason> elements (no @reason means that the port was deleted
483     "normally"). Note also that I<< the callback B<must> never die >>, so use
484     C<eval> if unsure.
485    
486     In the second form, the other port will be C<kil>'ed with C<@reason>, iff
487     a @reason was specified, i.e. on "normal" kils nothing happens, while
488     under all other conditions, the other port is killed with the same reason.
489    
490     In the last form, a message of the form C<@msg, @reason> will be C<snd>.
491    
492     Example: call a given callback when C<$port> is killed.
493    
494     mon $port, sub { warn "port died because of <@_>\n" };
495    
496     Example: kill ourselves when C<$port> is killed abnormally.
497    
498     mon $port, $self;
499    
500     Example: send us a restart message another C<$port> is killed.
501    
502     mon $port, $self => "restart";
503    
504     =cut
505    
506     sub mon {
507     my ($noderef, $port) = split /#/, shift, 2;
508    
509     my $node = $NODE{$noderef} || add_node $noderef;
510    
511     my $cb = shift;
512    
513     unless (ref $cb) {
514     if (@_) {
515     # send a kill info message
516     my (@msg) = ($cb, @_);
517     $cb = sub { snd @msg, @_ };
518     } else {
519     # simply kill other port
520     my $port = $cb;
521     $cb = sub { kil $port, @_ if @_ };
522     }
523     }
524    
525     $node->monitor ($port, $cb);
526    
527     defined wantarray
528     and AnyEvent::Util::guard { $node->unmonitor ($port, $cb) }
529     }
530    
531     =item $guard = mon_guard $port, $ref, $ref...
532    
533     Monitors the given C<$port> and keeps the passed references. When the port
534     is killed, the references will be freed.
535    
536     Optionally returns a guard that will stop the monitoring.
537    
538     This function is useful when you create e.g. timers or other watchers and
539     want to free them when the port gets killed:
540    
541     $port->rcv (start => sub {
542     my $timer; $timer = mon_guard $port, AE::timer 1, 1, sub {
543     undef $timer if 0.9 < rand;
544     });
545     });
546    
547     =cut
548    
549     sub mon_guard {
550     my ($port, @refs) = @_;
551    
552     mon $port, sub { 0 && @refs }
553     }
554    
555     =item lnk $port1, $port2
556    
557     Link two ports. This is simply a shorthand for:
558    
559     mon $port1, $port2;
560     mon $port2, $port1;
561    
562     It means that if either one is killed abnormally, the other one gets
563     killed as well.
564    
565 root 1.33 =item kil $port[, @reason]
566 root 1.32
567     Kill the specified port with the given C<@reason>.
568    
569     If no C<@reason> is specified, then the port is killed "normally" (linked
570     ports will not be kileld, or even notified).
571    
572     Otherwise, linked ports get killed with the same reason (second form of
573     C<mon>, see below).
574    
575     Runtime errors while evaluating C<rcv> callbacks or inside C<psub> blocks
576     will be reported as reason C<< die => $@ >>.
577    
578     Transport/communication errors are reported as C<< transport_error =>
579     $message >>.
580    
581 root 1.8 =back
582    
583 root 1.4 =head1 NODE MESSAGES
584    
585 root 1.5 Nodes understand the following messages sent to them. Many of them take
586     arguments called C<@reply>, which will simply be used to compose a reply
587     message - C<$reply[0]> is the port to reply to, C<$reply[1]> the type and
588     the remaining arguments are simply the message data.
589 root 1.4
590 root 1.29 While other messages exist, they are not public and subject to change.
591    
592 root 1.4 =over 4
593    
594     =cut
595    
596 root 1.22 =item lookup => $name, @reply
597 root 1.3
598 root 1.8 Replies with the port ID of the specified well-known port, or C<undef>.
599 root 1.3
600 root 1.7 =item devnull => ...
601    
602     Generic data sink/CPU heat conversion.
603    
604 root 1.4 =item relay => $port, @msg
605    
606     Simply forwards the message to the given port.
607    
608     =item eval => $string[ @reply]
609    
610     Evaluates the given string. If C<@reply> is given, then a message of the
611 root 1.5 form C<@reply, $@, @evalres> is sent.
612    
613     Example: crash another node.
614    
615     snd $othernode, eval => "exit";
616 root 1.4
617     =item time => @reply
618    
619     Replies the the current node time to C<@reply>.
620    
621 root 1.5 Example: tell the current node to send the current time to C<$myport> in a
622     C<timereply> message.
623    
624     snd $NODE, time => $myport, timereply => 1, 2;
625     # => snd $myport, timereply => 1, 2, <time>
626    
627 root 1.2 =back
628    
629 root 1.26 =head1 AnyEvent::MP vs. Distributed Erlang
630    
631 root 1.35 AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node
632     == aemp node, Erlang process == aemp port), so many of the documents and
633     programming techniques employed by Erlang apply to AnyEvent::MP. Here is a
634 root 1.27 sample:
635    
636 root 1.35 http://www.Erlang.se/doc/programming_rules.shtml
637     http://Erlang.org/doc/getting_started/part_frame.html # chapters 3 and 4
638     http://Erlang.org/download/Erlang-book-part1.pdf # chapters 5 and 6
639     http://Erlang.org/download/armstrong_thesis_2003.pdf # chapters 4 and 5
640 root 1.27
641     Despite the similarities, there are also some important differences:
642 root 1.26
643     =over 4
644    
645     =item * Node references contain the recipe on how to contact them.
646    
647     Erlang relies on special naming and DNS to work everywhere in the
648     same way. AEMP relies on each node knowing it's own address(es), with
649     convenience functionality.
650    
651 root 1.27 This means that AEMP requires a less tightly controlled environment at the
652     cost of longer node references and a slightly higher management overhead.
653    
654 root 1.26 =item * Erlang uses processes and a mailbox, AEMP does not queue.
655    
656     Erlang uses processes that selctively receive messages, and therefore
657     needs a queue. AEMP is event based, queuing messages would serve no useful
658     purpose.
659    
660 root 1.35 (But see L<Coro::MP> for a more Erlang-like process model on top of AEMP).
661 root 1.26
662     =item * Erlang sends are synchronous, AEMP sends are asynchronous.
663    
664 root 1.35 Sending messages in Erlang is synchronous and blocks the process. AEMP
665 root 1.26 sends are immediate, connection establishment is handled in the
666     background.
667    
668     =item * Erlang can silently lose messages, AEMP cannot.
669    
670     Erlang makes few guarantees on messages delivery - messages can get lost
671     without any of the processes realising it (i.e. you send messages a, b,
672     and c, and the other side only receives messages a and c).
673    
674     AEMP guarantees correct ordering, and the guarantee that there are no
675     holes in the message sequence.
676    
677 root 1.35 =item * In Erlang, processes can be declared dead and later be found to be
678 root 1.26 alive.
679    
680 root 1.35 In Erlang it can happen that a monitored process is declared dead and
681 root 1.26 linked processes get killed, but later it turns out that the process is
682     still alive - and can receive messages.
683    
684     In AEMP, when port monitoring detects a port as dead, then that port will
685     eventually be killed - it cannot happen that a node detects a port as dead
686     and then later sends messages to it, finding it is still alive.
687    
688     =item * Erlang can send messages to the wrong port, AEMP does not.
689    
690 root 1.35 In Erlang it is quite possible that a node that restarts reuses a process
691 root 1.26 ID known to other nodes for a completely different process, causing
692     messages destined for that process to end up in an unrelated process.
693    
694     AEMP never reuses port IDs, so old messages or old port IDs floating
695     around in the network will not be sent to an unrelated port.
696    
697     =item * Erlang uses unprotected connections, AEMP uses secure
698     authentication and can use TLS.
699    
700     AEMP can use a proven protocol - SSL/TLS - to protect connections and
701     securely authenticate nodes.
702    
703 root 1.28 =item * The AEMP protocol is optimised for both text-based and binary
704     communications.
705    
706 root 1.35 The AEMP protocol, unlike the Erlang protocol, supports both
707 root 1.28 language-independent text-only protocols (good for debugging) and binary,
708     language-specific serialisers (e.g. Storable).
709    
710     It has also been carefully designed to be implementable in other languages
711     with a minimum of work while gracefully degrading fucntionality to make the
712     protocol simple.
713    
714 root 1.35 =item * AEMP has more flexible monitoring options than Erlang.
715    
716     In Erlang, you can chose to receive I<all> exit signals as messages
717     or I<none>, there is no in-between, so monitoring single processes is
718     difficult to implement. Monitoring in AEMP is more flexible than in
719     Erlang, as one can choose between automatic kill, exit message or callback
720     on a per-process basis.
721    
722     =item * Erlang has different semantics for monitoring and linking, AEMP has the same.
723    
724     Monitoring in Erlang is not an indicator of process death/crashes,
725     as linking is (except linking is unreliable in Erlang). In AEMP, the
726     semantics of monitoring and linking are identical, linking is simply
727     two-way monitoring with automatic kill.
728    
729 root 1.26 =back
730    
731 root 1.1 =head1 SEE ALSO
732    
733     L<AnyEvent>.
734    
735     =head1 AUTHOR
736    
737     Marc Lehmann <schmorp@schmorp.de>
738     http://home.schmorp.de/
739    
740     =cut
741    
742     1
743