Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^2: How to pass AnyEvent socket handle to pre-forked child process?

by michaelfung (Novice)
on Jan 21, 2013 at 14:34 UTC ( #1014450=note: print w/ replies, xml ) Need Help??

Comment on Re^2: How to pass AnyEvent socket handle to pre-forked child process?
Re^3: How to pass AnyEvent socket handle to pre-forked child process?
by Corion (Pope) on Jan 21, 2013 at 14:41 UTC

    If whatever you receive actually is a filehandle, or even better, a socket, then you need to maybe wrap it with an AnyEvent::Handle. Looking at AnyEvent::Beanstalk, I don't see how to pass sockets around with it though.

      Thanks Corion. But I just think of a different approach: use a tcp load balancer to distribute traffic to pre-forked children listening on different ports of localhost.

Re^3: How to pass AnyEvent socket handle to pre-forked child process?
by zwon (Monsignor) on Jan 23, 2013 at 14:57 UTC

    You can use accept, you just should ensure that it will not block. Make server socket non-blocking, add read watcher to it, in read callback accept all connections. Something like:

    use AnyEvent::Util qw(fh_nonblocking); ...; fh_nonblocking $srv_sock, 1; my $w = AE::io $srv_sock, 0, sub { while(accept my $cli_sock, $srv_sock) { # initialize watchers for client socket } };

      Thanks Pavel! Now I know that sockets can be shared between forked childen.

      The following skeleton worked for me:

      # parent domain ... my $server_socket = IO::Socket::INET->new( Listen => 5, ReuseAddr => 1, LocalAddr => 'a.b.c.d', LocalPort => nnnn, Blocking => 0 ) # fork n children ... # child domain: fh_nonblocking $server_socket, 1; my $w = AE::io $server_socket, 0, sub { while(accept my $client_socket, $server_socket) { # setup handlers for this new client: $handles->{$client_id} = new AnyEvent::Handle( fh => $client_socket, on_read => sub { ... }, on_error => sub { ... }, ); $handles->{$client_id}->push_write ("Child $child_no welcome client + $client_id \015\012"); ...

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1014450]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (6)
As of 2014-09-23 00:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (208 votes), past polls