http://www.perlmonks.org?node_id=161569

These subs allow you control how much % CPU maximum will use your script. CPU_start() must be called once when you script start.
This example script will use 30% CPU until Ctrl-C pressed:
CPU_start(); CPU_max(30) while 1;
use Time::HiRes qw(time); sub CPU_used { (map {$_->[13]+$_->[14]} [split " ", Cat("/proc/self/stat")])[0] } { my %start = (tm => 0, cpu => 0); sub CPU_start { @start{"tm","cpu"} = (time(),CPU_used()) } sub CPU_max { my ($max, $real, $cpu) = ($_[0], time()-$start{tm}, CPU_used()-$start{cpu}); return unless defined($max) and $max > 0; &sleep( $cpu/$max-$real ); }} # # macro used from CPU_used() and CPU_max() # sub sleep { select undef,undef,undef,$_[0] } sub Cat { local *F; open F, "< ".$_[0] or return; local $/ unless wantarray; return <F>; }

Replies are listed 'Best First'.
Re: resource control: CPU
by lirm (Novice) on Apr 24, 2002 at 15:40 UTC
    I would suggest putting
    return unless $^O eq 'Linux';
    there. As this file - /proc/self/stat - only exists in this format on that system as far as I know,
    and I personally run FreeBSD (I checked Solaris too)...

    Just a thought.
    --
    Lirm

      I think it will be more clever, if somebody research how to do this on *BSD and other systems and send to me patch. ;-)
      And I'm sorry - I'm working only with Linux many years and I don't keep in mind portability problems... :(

      Update: I'm found nice standart function times() which can do something like my CPU_used() and I think it is possible to rewrite CPU_used() without using /proc/ now!

        times() is good within an particular (unix-ish) environment, but generally gives you clock ticks. Unfortunately those clock ticks may vary for different hardware and for different OSes depending on the jiffy (quantum) size, the CPU speed, and the power saving facilities...

        Don't get me wrong, it's still probably a 99% solution to what you were trying to do.