Re: IKC bug for client spawn?

Josh803316 <[email protected]>
Newsgroups gmane.comp.lang.perl.poe
Message-ID <[email protected]>
Yes, thanks to some members of the list I have been taught that this is
indeed correct and not a bug.  Makes more sense now.

I was trying to spawn a worker child but wasn't spawning it correctly
therefore the process was indeed inside the same kernel.  I'm now using a
wheel::run to spawn the child process and then have the ikc client connect.
I'm sure there is a more elegant way to do this but I need the portability
of the clients spawning locally as different processes, or on remote
machines that would connect back to the server.

(Inside the worker template package)
sub __spawn {
    my $class = shift;

    POE::Session->create(
           inline_states => {
                _start => \&create_ikc_client,
                worker_stdout => \&worker_stdout,
                worker_stderr => \&worker_stderr,
                worker_error  => \&worker_error,

           },
           args => [ $class ]
    );

}

sub create_ikc_client{
    my ( $kernel, $heap, $class ) = @_[ KERNEL, HEAP, ARG0 ];

    my $child = POE::Wheel::Run->new(
            Program => sub{
                    my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];

                    # Wipe the existing POE::Kernel clean.
                    POE::Kernel->stop();
                    print STDERR "Worker forked\n";

                    my $addr  = $class->IP   || '127.0.0.1';
                    my $port  = $class->PORT || 5667;
                    my $trace = $class->TRACE || 0;
                    my $debug = $class->DEBUG || 0;

                     POE::Component::IKC::Client->spawn(
                                 ip         => $addr,
                                port       => $port,
                                name       => "Client$$",
                                on_connect => sub {

                                            POE::Session->create(
                                                    package_states =>
                                                      ## extract all
subroutines that don't start with "__"
                                                      ## and allocate them
as states:
                                                      [
                                                         (__PACKAGE__) => [
do {
                                                                no strict
'refs';
                                                                grep {
!/^__/ and defined &$_ } keys %{ __PACKAGE__ . "::" };
                                                              } ],
                                                         ($class)       => [
$class->SUBSCRIBE_METHODS ]

                                                      ],
                                                    ## pass args into
_start:
                                                    args => [$class],
                                                    options => { trace =>
$trace, debug => $debug },

                                                );
                                },
                                on_error  => sub {
                                        my ( $kernel ) = $_[ KERNEL];
                                        print STDERR Dumper($kernel);
                                }

                    );

                    # Run the new sessions.
                    POE::Kernel->run();
            },
            ErrorEvent   => "worker_error",
            StdoutEvent  => "worker_stdout",
            StderrEvent  => "worker_stderr",
            CloseEvent   => "worker_close",

    ) or die "$0: can't POE::Wheel::Run->new";

    $heap->{worker} = $child;

    return $child;
}

On Tue, May 5, 2009 at 3:41 PM, Nick Perez <[email protected]> wrote:

> On Tue, 5 May 2009 10:34:53 -0700
> Josh803316 <[email protected]> wrote:
>
> > It appears that if you start an IKC server and then an ikc client
> > connects to it from within the same POE::Kernel->run() then we get
> > the following error:
> >
> > 23289: Remote kernel 'host.domain-4a0076da00005af9' already exists
> > 23289: Remote kernel 'host.domain-4a0076da00005af9' already exists
> >
> > Single program flow:
> >
> > POE::Component::IKC::Server->spawn();
> > POE::Component::IKC::Client->spawn();
> >
> > POE::Kernel->run();
> >
> > This is where we get the run time error from the client about the
> > remote kernel already existing. The error doesn't seem to affect
> > anything else but I assume this is either a bug or I'm doing
> > something wrong.
>
>
> Erm, you do realize that IKC is mostly for inter process communication
> right? Running both within the same kernel (process) and it throwing
> that warning is /exactly/ what it should be doing.
>
> --
>
> Nicholas Perez
> XMPP/Email: [email protected]
> http://search.cpan.org/~nperez/ <http://search.cpan.org/%7Enperez/>
> http://github.com/nperez
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.