ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.39
Committed: Fri Aug 7 23:21:48 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.38: +4 -1 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 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 root 1.39 called. This function must be a fully-qualified function name
625 root 1.38 (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 root 1.39 $_[0] =~ /::/
675     or Carp::croak "spawn init function must be a fully-qualified name, caught";
676    
677 root 1.38 ($NODE{$noderef} || add_node $noderef)
678     ->send (["", "AnyEvent::MP::_spawn" => $id, @_]);
679    
680     "$noderef#$id"
681     }
682    
683 root 1.8 =back
684    
685 root 1.4 =head1 NODE MESSAGES
686    
687 root 1.5 Nodes understand the following messages sent to them. Many of them take
688     arguments called C<@reply>, which will simply be used to compose a reply
689     message - C<$reply[0]> is the port to reply to, C<$reply[1]> the type and
690     the remaining arguments are simply the message data.
691 root 1.4
692 root 1.29 While other messages exist, they are not public and subject to change.
693    
694 root 1.4 =over 4
695    
696     =cut
697    
698 root 1.22 =item lookup => $name, @reply
699 root 1.3
700 root 1.8 Replies with the port ID of the specified well-known port, or C<undef>.
701 root 1.3
702 root 1.7 =item devnull => ...
703    
704     Generic data sink/CPU heat conversion.
705    
706 root 1.4 =item relay => $port, @msg
707    
708     Simply forwards the message to the given port.
709    
710     =item eval => $string[ @reply]
711    
712     Evaluates the given string. If C<@reply> is given, then a message of the
713 root 1.5 form C<@reply, $@, @evalres> is sent.
714    
715     Example: crash another node.
716    
717     snd $othernode, eval => "exit";
718 root 1.4
719     =item time => @reply
720    
721     Replies the the current node time to C<@reply>.
722    
723 root 1.5 Example: tell the current node to send the current time to C<$myport> in a
724     C<timereply> message.
725    
726     snd $NODE, time => $myport, timereply => 1, 2;
727     # => snd $myport, timereply => 1, 2, <time>
728    
729 root 1.2 =back
730    
731 root 1.26 =head1 AnyEvent::MP vs. Distributed Erlang
732    
733 root 1.35 AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node
734     == aemp node, Erlang process == aemp port), so many of the documents and
735     programming techniques employed by Erlang apply to AnyEvent::MP. Here is a
736 root 1.27 sample:
737    
738 root 1.35 http://www.Erlang.se/doc/programming_rules.shtml
739     http://Erlang.org/doc/getting_started/part_frame.html # chapters 3 and 4
740     http://Erlang.org/download/Erlang-book-part1.pdf # chapters 5 and 6
741     http://Erlang.org/download/armstrong_thesis_2003.pdf # chapters 4 and 5
742 root 1.27
743     Despite the similarities, there are also some important differences:
744 root 1.26
745     =over 4
746    
747     =item * Node references contain the recipe on how to contact them.
748    
749     Erlang relies on special naming and DNS to work everywhere in the
750     same way. AEMP relies on each node knowing it's own address(es), with
751     convenience functionality.
752    
753 root 1.27 This means that AEMP requires a less tightly controlled environment at the
754     cost of longer node references and a slightly higher management overhead.
755    
756 root 1.26 =item * Erlang uses processes and a mailbox, AEMP does not queue.
757    
758     Erlang uses processes that selctively receive messages, and therefore
759     needs a queue. AEMP is event based, queuing messages would serve no useful
760     purpose.
761    
762 root 1.35 (But see L<Coro::MP> for a more Erlang-like process model on top of AEMP).
763 root 1.26
764     =item * Erlang sends are synchronous, AEMP sends are asynchronous.
765    
766 root 1.35 Sending messages in Erlang is synchronous and blocks the process. AEMP
767 root 1.26 sends are immediate, connection establishment is handled in the
768     background.
769    
770     =item * Erlang can silently lose messages, AEMP cannot.
771    
772     Erlang makes few guarantees on messages delivery - messages can get lost
773     without any of the processes realising it (i.e. you send messages a, b,
774     and c, and the other side only receives messages a and c).
775    
776     AEMP guarantees correct ordering, and the guarantee that there are no
777     holes in the message sequence.
778    
779 root 1.35 =item * In Erlang, processes can be declared dead and later be found to be
780 root 1.26 alive.
781    
782 root 1.35 In Erlang it can happen that a monitored process is declared dead and
783 root 1.26 linked processes get killed, but later it turns out that the process is
784     still alive - and can receive messages.
785    
786     In AEMP, when port monitoring detects a port as dead, then that port will
787     eventually be killed - it cannot happen that a node detects a port as dead
788     and then later sends messages to it, finding it is still alive.
789    
790     =item * Erlang can send messages to the wrong port, AEMP does not.
791    
792 root 1.35 In Erlang it is quite possible that a node that restarts reuses a process
793 root 1.26 ID known to other nodes for a completely different process, causing
794     messages destined for that process to end up in an unrelated process.
795    
796     AEMP never reuses port IDs, so old messages or old port IDs floating
797     around in the network will not be sent to an unrelated port.
798    
799     =item * Erlang uses unprotected connections, AEMP uses secure
800     authentication and can use TLS.
801    
802     AEMP can use a proven protocol - SSL/TLS - to protect connections and
803     securely authenticate nodes.
804    
805 root 1.28 =item * The AEMP protocol is optimised for both text-based and binary
806     communications.
807    
808 root 1.35 The AEMP protocol, unlike the Erlang protocol, supports both
809 root 1.28 language-independent text-only protocols (good for debugging) and binary,
810     language-specific serialisers (e.g. Storable).
811    
812     It has also been carefully designed to be implementable in other languages
813     with a minimum of work while gracefully degrading fucntionality to make the
814     protocol simple.
815    
816 root 1.35 =item * AEMP has more flexible monitoring options than Erlang.
817    
818     In Erlang, you can chose to receive I<all> exit signals as messages
819     or I<none>, there is no in-between, so monitoring single processes is
820     difficult to implement. Monitoring in AEMP is more flexible than in
821     Erlang, as one can choose between automatic kill, exit message or callback
822     on a per-process basis.
823    
824 root 1.37 =item * Erlang tries to hide remote/local connections, AEMP does not.
825 root 1.35
826     Monitoring in Erlang is not an indicator of process death/crashes,
827 root 1.37 as linking is (except linking is unreliable in Erlang).
828    
829     In AEMP, you don't "look up" registered port names or send to named ports
830     that might or might not be persistent. Instead, you normally spawn a port
831     on the remote node. The init function monitors the you, and you monitor
832     the remote port. Since both monitors are local to the node, they are much
833     more reliable.
834    
835     This also saves round-trips and avoids sending messages to the wrong port
836     (hard to do in Erlang).
837 root 1.35
838 root 1.26 =back
839    
840 root 1.1 =head1 SEE ALSO
841    
842     L<AnyEvent>.
843    
844     =head1 AUTHOR
845    
846     Marc Lehmann <schmorp@schmorp.de>
847     http://home.schmorp.de/
848    
849     =cut
850    
851     1
852