On Friday 07 December 2001 07:02 am, you wrote:
<snip>
>
> > I use STDERR to signal The Wheel::Run's job completion as I'm using
> > STDOUT as a data stream channel. When I get a specific 'done' event from
> > STDERR I kill the wheel. I guess it's possible the STDERR event is
> > caught before the STDOUT pipe is flushed. The sleep 2; fixed this in
> > most instances, but I still end up with lost data 5-10% of the time.
>
> Please do not do things like that. You cannot avoid races with delays, even
> if they are really big. You should be happy instead, that you found it :)
> Is this behaviour because input events now go through the queue, and
> signals not ? Or did I miss something ...
my $coderef = sub {
my( $request ) = $_[0];
my $sent_header = 0;
my $agent = LWP::UserAgent->new( timeout => 45 );
my $response = $agent->request($request, sub { &data(\$sent_header, @_) },
2048);
.... deal with possible responses ...
sleep 2;
}
Later...
sub _start {
.... lots of tests on things ...
.... decided I need to run Wheel::Run ....
$self->{run} = POE::Wheel::Run->new(
Program => sub { $coderef->( $self->{request} ) },
StdoutEvent => 'stdout',
StderrEvent => 'stderr',
Filter => POE::Filter::Stream->new()
);
Where would I be calling delay? It seems to me I'd need to replace my sleep
call with it, but that coderef knows nothing of POE and it's running in a
child process. Should I be passing off KERNEL to $coderef->( ) and calling
delay from within the coderef?
I don't know if this has to do with Input Events and the queue. I've always
experienced this behavior with CVS. I haven't tested with earlier code.
How do I know how long of a delay to use? Is using STDERR to signal
completion to the parent also bad karma?
Thanks.
> torvald