async { while( $Q->dequeue() ) { ## process message. } }; async { until( $dieNow ) { sleep $someTime; ## do housekeeping. } }; #### while( my( $nfound, $timeleft) = select( ..., $timeout ) ) { if( $timeleft ) { ## Nothing doing, do some housekeeping } else { ## deal with the event } } #### use Time::HiRes qw[ sleep ]; ... until( $dieNow ) { sleep( $timeout / 10 ); if( my $dgram = $Q->dequeue_nb() ) { ## Act on $dgram } else { ## Do housekeeping (if required). } } #### async{ 1 while Win32::Sleep( 100 ); }->join;;