in reply to Re^2: Coro::Channel, worker thread and timeout
in thread Coro::Channel, worker thread and timeout
I don't know for sure how the AnyEvent timer works, but I know that a hung IO operation, as you describe will totally block a thread from running as expected, even signals won't make it in. My guess is the AnyEvent event-loop is being blocked by the hung IO operation, it just isn't getting any cpu time to function.
I was just looking at a few modules that my be what you need, Async-Interrupt and EV-Loop-Async and [IO-Async-Loop-AnyEvent.
Those modules put the eventloop in a separate thread, and it says somewhere in the README's that AnyEvent is a convenience module, for cases when you don't need the full power of EV and EV-Loop-Async.
You could do something yourself manually, create a separate thread that won't be blocked by another thread's hung IO. Here is a crude example:
#!/usr/bin/perl -w use strict; use threads; use threads::shared; my $timer_go:shared = 0; my $worker = threads->create(\&worker); my $timer = threads->create(\&timer,$worker); print "hit enter to start\n"; <>; $timer_go=1; <>; $timer->join(); $worker->join(); sub timer { my $worker = shift; while(1){ if($timer_go){ my $count = 0; while(1){ $count++; if($count > 5){ print "timed out\nHit enter to finish\n"; # Send a signal to a thread $worker->kill('INT'); return; } sleep 1; print "timing $count\n"; } }else{sleep 1} } } sub worker { $|++; $SIG{INT} = sub{ warn "Caught Zap!\n"; sleep 1; exit; }; my $worker_pid = open( READ, "top -d 1 -b |" ); print "\t$worker_pid\n"; while(<READ>){} return; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Coro::Channel, worker thread and timeout
by Corion (Patriarch) on Sep 13, 2011 at 12:02 UTC | |
|
Re^4: Coro::Channel, worker thread and timeout
by Marseille07 (Acolyte) on Sep 14, 2011 at 05:19 UTC |