in reply to do something no more than 3 times a second

If you don't mind doing a *busy* loop (which might or might not a bad idea, depending on application), you could take the requirements literally: Before starting the external program, you remember the value of time(). If you found that during the last three executions, you already had recorded the same time value, you just busily loop until the time value increases.

Of course I can imagine circumstances where you will be shot doing this programming style, but this is something you can best decide yourself.

-- 
Ronald Fischer <ynnor@mm.st>

Replies are listed 'Best First'.
Re^2: do something no more than 3 times a second
by ikegami (Patriarch) on Nov 26, 2010 at 23:33 UTC

    This can be done without a busy loop.

    use Time::HiRes qw( time sleep ); use constant { TIMES_PER_PERIOD => 3, # Integer PERIOD => 1.0, # Fractional seconds }; my @times = (0) x TIMES_PER_PERIOD; while (my $r = get_request()) { my $wait = ($times[0] + PERIOD) - time(); if ($wait > 0) { sleep($wait); redo; # In case sleep got interrupted. } do_request($r); shift(@times); push(@times, time()); }

    (My placement of do_request prevents more than three request from being served per second. Move do_request after the push to prevent more than three requests from being started per second. roboticus and JavaFan used the latter interpretation.)

    It's not that useful here. Since the requests are coming from a file, they are coming in as fast as they can be serviced, so waiting is going to be necessary.

      This can be done without a busy loop.
      Of course, it can, if you use a HiRes timer. I've suggested the busy loop as an alternative (since the timer was already suggested by JavaFan anyway), in case the OP doesn't want to use the timer. Though doing a busy loop is quite often a bad idea, there *are* cases where it makes more sense than using this kind of timer. I thought that if the OP sees these alternatives, s/he can choose what works best in the current situation.

      -- 
      Ronald Fischer <ynnor@mm.st>

        If you want a busy loop, just comment out the sleep line. I don't see how that makes any sense, though.

        Of course, it can, if you use a HiRes timer.

        You have to use a timer either way. Or is hires somehow meaningful in that sentence? I don't see why, so could you give a example reason?

        there *are* cases where it makes more sense

        What would be such a case? I can't think of an example where doing a busy loop is acceptable if the system has a notification API. (In this case, sleep is that API since we're only interested in waiting for an amount of time.)