ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
Revision: 1.43
Committed: Sun Aug 9 16:08:16 2009 UTC (14 years, 9 months ago) by root
Branch: MAIN
CVS Tags: rel-0_4
Changes since 1.42: +3 -2 lines
Log Message:
0.4

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