Working with timeouts

Ask Bjørn Hansen ask at develooper.com
Tue Nov 27 22:01:31 UTC 2007


On Nov 27, 2007, at 1:52 PM, Sam Tregar wrote:

> How are you doing it exactly - alarm() or something fancier?  Care  
> to share your code?


Yeah, just with alarm.  Variations of:

     my $result = eval {
         local $SIG{ALRM} = sub { die "timeout" };
         alarm $timeout + 2;
         my $result = $gclient->do_task($func_name, freeze($args));
         alarm 0;
         return $result;
     };
     alarm 0;
     die ERROR_FOOBAR->with_description("System error: No data  
returned: $@")
             if ($@ or !($result and $$result));

The double "alarm 0" is to make sure the alarm gets reset before we  
exit the eval and in case of error.

IIRC the $timeout+2 here is because we have the worker do timeouts too  
(the worker in this case is doing a sometimes large job against  
another server with an obscure protocol), so we have the worker do a  
timeout on that too and sometimes it can return a more meaningful  
result than we get when the client does the timeout.


   - ask

-- 
http://develooper.com/ - http://askask.com/




More information about the Gearman mailing list