ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-MP/MP.pm
(Generate patch)

Comparing AnyEvent-MP/MP.pm (file contents):
Revision 1.85 by root, Tue Sep 8 01:54:13 2009 UTC vs.
Revision 1.93 by root, Tue Sep 22 14:14:29 2009 UTC

1=head1 NAME 1=head1 NAME
2 2
3AnyEvent::MP - multi-processing/message-passing framework 3AnyEvent::MP - erlang-style multi-processing/message-passing framework
4 4
5=head1 SYNOPSIS 5=head1 SYNOPSIS
6 6
7 use AnyEvent::MP; 7 use AnyEvent::MP;
8 8
31 31
32 # create a port on another node 32 # create a port on another node
33 my $port = spawn $node, $initfunc, @initdata; 33 my $port = spawn $node, $initfunc, @initdata;
34 34
35 # monitoring 35 # monitoring
36 mon $port, $cb->(@msg) # callback is invoked on death 36 mon $localport, $cb->(@msg) # callback is invoked on death
37 mon $port, $otherport # kill otherport on abnormal death 37 mon $localport, $otherport # kill otherport on abnormal death
38 mon $port, $otherport, @msg # send message on death 38 mon $localport, $otherport, @msg # send message on death
39 39
40=head1 CURRENT STATUS 40=head1 CURRENT STATUS
41 41
42 bin/aemp - stable. 42 bin/aemp - stable.
43 AnyEvent::MP - stable API, should work. 43 AnyEvent::MP - stable API, should work.
44 AnyEvent::MP::Intro - explains most concepts. 44 AnyEvent::MP::Intro - explains most concepts.
45 AnyEvent::MP::Kernel - mostly stable. 45 AnyEvent::MP::Kernel - mostly stable API.
46 AnyEvent::MP::Global - stable but incomplete, protocol not yet final. 46 AnyEvent::MP::Global - stable API.
47
48stay tuned.
49 47
50=head1 DESCRIPTION 48=head1 DESCRIPTION
51 49
52This module (-family) implements a simple message passing framework. 50This module (-family) implements a simple message passing framework.
53 51
109to have fixed listening addresses, seed nodes are perfectly normal nodes - 107to have fixed listening addresses, seed nodes are perfectly normal nodes -
110any node can function as a seed node for others. 108any node can function as a seed node for others.
111 109
112In addition to discovering the network, seed nodes are also used to 110In addition to discovering the network, seed nodes are also used to
113maintain the network and to connect nodes that otherwise would have 111maintain the network and to connect nodes that otherwise would have
114trouble connecting. They form the backbone of the AnyEvent::MP network. 112trouble connecting. They form the backbone of an AnyEvent::MP network.
115 113
116Seed nodes are expected to be long-running, and at least one seed node 114Seed nodes are expected to be long-running, and at least one seed node
117should always be available. They should also be relatively responsive - a 115should always be available. They should also be relatively responsive - a
118seed node that blocks for long periods will slow down everybody else. 116seed node that blocks for long periods will slow down everybody else.
119 117
150our $VERSION = $AnyEvent::MP::Kernel::VERSION; 148our $VERSION = $AnyEvent::MP::Kernel::VERSION;
151 149
152our @EXPORT = qw( 150our @EXPORT = qw(
153 NODE $NODE *SELF node_of after 151 NODE $NODE *SELF node_of after
154 configure 152 configure
155 snd rcv mon mon_guard kil reg psub spawn 153 snd rcv mon mon_guard kil psub spawn cal
156 port 154 port
157); 155);
158 156
159our $SELF; 157our $SELF;
160 158
229L<AnyEvent::MP::Global> module, which will then use it to keep 227L<AnyEvent::MP::Global> module, which will then use it to keep
230connectivity with at least one node at any point in time. 228connectivity with at least one node at any point in time.
231 229
232=back 230=back
233 231
234Example: become a distributed node using the locla node name as profile. 232Example: become a distributed node using the local node name as profile.
235This should be the most common form of invocation for "daemon"-type nodes. 233This should be the most common form of invocation for "daemon"-type nodes.
236 234
237 configure 235 configure
238 236
239Example: become an anonymous node. This form is often used for commandline 237Example: become an anonymous node. This form is often used for commandline
567 } 565 }
568 566
569 $node->monitor ($port, $cb); 567 $node->monitor ($port, $cb);
570 568
571 defined wantarray 569 defined wantarray
570 and $cb += 0
572 and AnyEvent::Util::guard { $node->unmonitor ($port, $cb) } 571 and AnyEvent::Util::guard { $node->unmonitor ($port, $cb) }
573} 572}
574 573
575=item $guard = mon_guard $port, $ref, $ref... 574=item $guard = mon_guard $port, $ref, $ref...
576 575
715 ? $action[0]() 714 ? $action[0]()
716 : snd @action; 715 : snd @action;
717 }; 716 };
718} 717}
719 718
719=item cal $port, @msg, $callback[, $timeout]
720
721A simple form of RPC - sends a message to the given C<$port> with the
722given contents (C<@msg>), but adds a reply port to the message.
723
724The reply port is created temporarily just for the purpose of receiving
725the reply, and will be C<kil>ed when no longer needed.
726
727A reply message sent to the port is passed to the C<$callback> as-is.
728
729If an optional time-out (in seconds) is given and it is not C<undef>,
730then the callback will be called without any arguments after the time-out
731elapsed and the port is C<kil>ed.
732
733If no time-out is given, then the local port will monitor the remote port
734instead, so it eventually gets cleaned-up.
735
736Currently this function returns the temporary port, but this "feature"
737might go in future versions unless you can make a convincing case that
738this is indeed useful for something.
739
740=cut
741
742sub cal(@) {
743 my $timeout = ref $_[-1] ? undef : pop;
744 my $cb = pop;
745
746 my $port = port {
747 undef $timeout;
748 kil $SELF;
749 &$cb;
750 };
751
752 if (defined $timeout) {
753 $timeout = AE::timer $timeout, 0, sub {
754 undef $timeout;
755 kil $port;
756 $cb->();
757 };
758 } else {
759 mon $_[0], sub {
760 kil $port;
761 $cb->();
762 };
763 }
764
765 push @_, $port;
766 &snd;
767
768 $port
769}
770
720=back 771=back
721 772
722=head1 AnyEvent::MP vs. Distributed Erlang 773=head1 AnyEvent::MP vs. Distributed Erlang
723 774
724AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node 775AnyEvent::MP got lots of its ideas from distributed Erlang (Erlang node

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines