ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.42
Committed: Sun Aug 9 00:41:49 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
Changes since 1.41: +11 -2 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.42 Monitor the given port and do something when the port is killed or
507     messages to it were lost, and optionally return a guard that can be used
508     to stop monitoring again.
509    
510     C<mon> effectively guarantees that, in the absence of hardware failures,
511     that after starting the monitor, either all messages sent to the port
512     will arrive, or the monitoring action will be invoked after possible
513     message loss has been detected. No messages will be lost "in between"
514     (after the first lost message no further messages will be received by the
515     port). After the monitoring action was invoked, further messages might get
516     delivered again.
517 root 1.32
518 root 1.36 In the first form (callback), the callback is simply called with any
519     number of C<@reason> elements (no @reason means that the port was deleted
520 root 1.32 "normally"). Note also that I<< the callback B<must> never die >>, so use
521     C<eval> if unsure.
522    
523 root 1.36 In the second form (another port given), the other port (C<$rcvport)
524     will be C<kil>'ed with C<@reason>, iff a @reason was specified, i.e. on
525     "normal" kils nothing happens, while under all other conditions, the other
526     port is killed with the same reason.
527 root 1.32
528 root 1.36 The third form (kill self) is the same as the second form, except that
529     C<$rvport> defaults to C<$SELF>.
530    
531     In the last form (message), a message of the form C<@msg, @reason> will be
532     C<snd>.
533 root 1.32
534 root 1.37 As a rule of thumb, monitoring requests should always monitor a port from
535     a local port (or callback). The reason is that kill messages might get
536     lost, just like any other message. Another less obvious reason is that
537     even monitoring requests can get lost (for exmaple, when the connection
538     to the other node goes down permanently). When monitoring a port locally
539     these problems do not exist.
540    
541 root 1.32 Example: call a given callback when C<$port> is killed.
542    
543     mon $port, sub { warn "port died because of <@_>\n" };
544    
545     Example: kill ourselves when C<$port> is killed abnormally.
546    
547 root 1.36 mon $port;
548 root 1.32
549 root 1.36 Example: send us a restart message when another C<$port> is killed.
550 root 1.32
551     mon $port, $self => "restart";
552    
553     =cut
554    
555     sub mon {
556     my ($noderef, $port) = split /#/, shift, 2;
557    
558     my $node = $NODE{$noderef} || add_node $noderef;
559    
560 root 1.41 my $cb = @_ ? shift : $SELF || Carp::croak 'mon: called with one argument only, but $SELF not set,';
561 root 1.32
562     unless (ref $cb) {
563     if (@_) {
564     # send a kill info message
565 root 1.41 my (@msg) = ($cb, @_);
566 root 1.32 $cb = sub { snd @msg, @_ };
567     } else {
568     # simply kill other port
569     my $port = $cb;
570     $cb = sub { kil $port, @_ if @_ };
571     }
572     }
573    
574     $node->monitor ($port, $cb);
575    
576     defined wantarray
577     and AnyEvent::Util::guard { $node->unmonitor ($port, $cb) }
578     }
579    
580     =item $guard = mon_guard $port, $ref, $ref...
581    
582     Monitors the given C<$port> and keeps the passed references. When the port
583     is killed, the references will be freed.
584    
585     Optionally returns a guard that will stop the monitoring.
586    
587     This function is useful when you create e.g. timers or other watchers and
588     want to free them when the port gets killed:
589    
590     $port->rcv (start => sub {
591     my $timer; $timer = mon_guard $port, AE::timer 1, 1, sub {
592     undef $timer if 0.9 < rand;
593     });
594     });
595    
596     =cut
597    
598     sub mon_guard {
599     my ($port, @refs) = @_;
600    
601 root 1.36 #TODO: mon-less form?
602    
603 root 1.32 mon $port, sub { 0 && @refs }
604     }
605    
606 root 1.33 =item kil $port[, @reason]
607 root 1.32
608     Kill the specified port with the given C<@reason>.
609    
610     If no C<@reason> is specified, then the port is killed "normally" (linked
611     ports will not be kileld, or even notified).
612    
613     Otherwise, linked ports get killed with the same reason (second form of
614     C<mon>, see below).
615    
616     Runtime errors while evaluating C<rcv> callbacks or inside C<psub> blocks
617     will be reported as reason C<< die => $@ >>.
618    
619     Transport/communication errors are reported as C<< transport_error =>
620     $message >>.
621    
622 root 1.38 =cut
623    
624     =item $port = spawn $node, $initfunc[, @initdata]
625    
626     Creates a port on the node C<$node> (which can also be a port ID, in which
627     case it's the node where that port resides).
628    
629     The port ID of the newly created port is return immediately, and it is
630     permissible to immediately start sending messages or monitor the port.
631    
632     After the port has been created, the init function is
633 root 1.39 called. This function must be a fully-qualified function name
634 root 1.40 (e.g. C<MyApp::Chat::Server::init>). To specify a function in the main
635     program, use C<::name>.
636 root 1.38
637     If the function doesn't exist, then the node tries to C<require>
638     the package, then the package above the package and so on (e.g.
639     C<MyApp::Chat::Server>, C<MyApp::Chat>, C<MyApp>) until the function
640     exists or it runs out of package names.
641    
642     The init function is then called with the newly-created port as context
643     object (C<$SELF>) and the C<@initdata> values as arguments.
644    
645     A common idiom is to pass your own port, monitor the spawned port, and
646     in the init function, monitor the original port. This two-way monitoring
647     ensures that both ports get cleaned up when there is a problem.
648    
649     Example: spawn a chat server port on C<$othernode>.
650    
651     # this node, executed from within a port context:
652     my $server = spawn $othernode, "MyApp::Chat::Server::connect", $SELF;
653     mon $server;
654    
655     # init function on C<$othernode>
656     sub connect {
657     my ($srcport) = @_;
658    
659     mon $srcport;
660    
661     rcv $SELF, sub {
662     ...
663     };
664     }
665    
666     =cut
667    
668     sub _spawn {
669     my $port = shift;
670     my $init = shift;
671    
672     local $SELF = "$NODE#$port";
673     eval {
674     &{ load_func $init }
675     };
676     _self_die if $@;
677     }
678    
679     sub spawn(@) {
680     my ($noderef, undef) = split /#/, shift, 2;
681    
682     my $id = "$RUNIQ." . $ID++;
683    
684 root 1.39 $_[0] =~ /::/
685     or Carp::croak "spawn init function must be a fully-qualified name, caught";
686    
687 root 1.38 ($NODE{$noderef} || add_node $noderef)
688     ->send (["", "AnyEvent::MP::_spawn" => $id, @_]);
689    
690     "$noderef#$id"
691     }
692    
693 root 1.8 =back
694    
695 root 1.4 =head1 NODE MESSAGES
696    
697 root 1.5 Nodes understand the following messages sent to them. Many of them take
698     arguments called C<@reply>, which will simply be used to compose a reply
699     message - C<$reply[0]> is the port to reply to, C<$reply[1]> the type and
700     the remaining arguments are simply the message data.
701 root 1.4
702 root 1.29 While other messages exist, they are not public and subject to change.
703    
704 root 1.4 =over 4
705    
706     =cut
707    
708 root 1.22 =item lookup => $name, @reply
709 root 1.3
710 root 1.8 Replies with the port ID of the specified well-known port, or C<undef>.
711 root 1.3
712 root 1.7 =item devnull => ...
713    
714     Generic data sink/CPU heat conversion.
715    
716 root 1.4 =item relay => $port, @msg
717    
718     Simply forwards the message to the given port.
719    
720     =item eval => $string[ @reply]
721    
722     Evaluates the given string. If C<@reply> is given, then a message of the
723 root 1.5 form C<@reply, $@, @evalres> is sent.
724    
725     Example: crash another node.
726    
727     snd $othernode, eval => "exit";
728 root 1.4
729     =item time => @reply
730    
731     Replies the the current node time to C<@reply>.
732    
733 root 1.5 Example: tell the current node to send the current time to C<$myport> in a
734     C<timereply> message.
735    
736     snd $NODE, time => $myport, timereply => 1, 2;
737     # => snd $myport, timereply => 1, 2, <time>
738    
739 root 1.2 =back
740    
741 root 1.26 =head1 AnyEvent::MP vs. Distributed Erlang
742    
743 root 1.35 AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node
744     == aemp node, Erlang process == aemp port), so many of the documents and
745     programming techniques employed by Erlang apply to AnyEvent::MP. Here is a
746 root 1.27 sample:
747    
748 root 1.35 http://www.Erlang.se/doc/programming_rules.shtml
749     http://Erlang.org/doc/getting_started/part_frame.html # chapters 3 and 4
750     http://Erlang.org/download/Erlang-book-part1.pdf # chapters 5 and 6
751     http://Erlang.org/download/armstrong_thesis_2003.pdf # chapters 4 and 5
752 root 1.27
753     Despite the similarities, there are also some important differences:
754 root 1.26
755     =over 4
756    
757     =item * Node references contain the recipe on how to contact them.
758    
759     Erlang relies on special naming and DNS to work everywhere in the
760     same way. AEMP relies on each node knowing it's own address(es), with
761     convenience functionality.
762    
763 root 1.27 This means that AEMP requires a less tightly controlled environment at the
764     cost of longer node references and a slightly higher management overhead.
765    
766 root 1.26 =item * Erlang uses processes and a mailbox, AEMP does not queue.
767    
768     Erlang uses processes that selctively receive messages, and therefore
769     needs a queue. AEMP is event based, queuing messages would serve no useful
770     purpose.
771    
772 root 1.35 (But see L<Coro::MP> for a more Erlang-like process model on top of AEMP).
773 root 1.26
774     =item * Erlang sends are synchronous, AEMP sends are asynchronous.
775    
776 root 1.35 Sending messages in Erlang is synchronous and blocks the process. AEMP
777 root 1.26 sends are immediate, connection establishment is handled in the
778     background.
779    
780     =item * Erlang can silently lose messages, AEMP cannot.
781    
782     Erlang makes few guarantees on messages delivery - messages can get lost
783     without any of the processes realising it (i.e. you send messages a, b,
784     and c, and the other side only receives messages a and c).
785    
786     AEMP guarantees correct ordering, and the guarantee that there are no
787     holes in the message sequence.
788    
789 root 1.35 =item * In Erlang, processes can be declared dead and later be found to be
790 root 1.26 alive.
791    
792 root 1.35 In Erlang it can happen that a monitored process is declared dead and
793 root 1.26 linked processes get killed, but later it turns out that the process is
794     still alive - and can receive messages.
795    
796     In AEMP, when port monitoring detects a port as dead, then that port will
797     eventually be killed - it cannot happen that a node detects a port as dead
798     and then later sends messages to it, finding it is still alive.
799    
800     =item * Erlang can send messages to the wrong port, AEMP does not.
801    
802 root 1.35 In Erlang it is quite possible that a node that restarts reuses a process
803 root 1.26 ID known to other nodes for a completely different process, causing
804     messages destined for that process to end up in an unrelated process.
805    
806     AEMP never reuses port IDs, so old messages or old port IDs floating
807     around in the network will not be sent to an unrelated port.
808    
809     =item * Erlang uses unprotected connections, AEMP uses secure
810     authentication and can use TLS.
811    
812     AEMP can use a proven protocol - SSL/TLS - to protect connections and
813     securely authenticate nodes.
814    
815 root 1.28 =item * The AEMP protocol is optimised for both text-based and binary
816     communications.
817    
818 root 1.35 The AEMP protocol, unlike the Erlang protocol, supports both
819 root 1.28 language-independent text-only protocols (good for debugging) and binary,
820     language-specific serialisers (e.g. Storable).
821    
822     It has also been carefully designed to be implementable in other languages
823     with a minimum of work while gracefully degrading fucntionality to make the
824     protocol simple.
825    
826 root 1.35 =item * AEMP has more flexible monitoring options than Erlang.
827    
828     In Erlang, you can chose to receive I<all> exit signals as messages
829     or I<none>, there is no in-between, so monitoring single processes is
830     difficult to implement. Monitoring in AEMP is more flexible than in
831     Erlang, as one can choose between automatic kill, exit message or callback
832     on a per-process basis.
833    
834 root 1.37 =item * Erlang tries to hide remote/local connections, AEMP does not.
835 root 1.35
836     Monitoring in Erlang is not an indicator of process death/crashes,
837 root 1.37 as linking is (except linking is unreliable in Erlang).
838    
839     In AEMP, you don't "look up" registered port names or send to named ports
840     that might or might not be persistent. Instead, you normally spawn a port
841     on the remote node. The init function monitors the you, and you monitor
842     the remote port. Since both monitors are local to the node, they are much
843     more reliable.
844    
845     This also saves round-trips and avoids sending messages to the wrong port
846     (hard to do in Erlang).
847 root 1.35
848 root 1.26 =back
849    
850 root 1.1 =head1 SEE ALSO
851    
852     L<AnyEvent>.
853    
854     =head1 AUTHOR
855    
856     Marc Lehmann <schmorp@schmorp.de>
857     http://home.schmorp.de/
858    
859     =cut
860    
861     1
862