Jump to content
Vhaerun

Module perl facute de noi

Recommended Posts

Posted

Am avut nevoie zilele trecute sa explic la cineva cum functioneaza fork si threaduri , pentru a pune ceva sa se execute in fundal , si respectivul nu a inteles :)

Asa ca am facut un modul perl ( nu prea ma ocup cu ele ,de aceea calitatea s-ar putea sa nu fie chiar punctul forte , dar e functionabil ) , care sa ii dea posibilitatea sa execute subrutine in fundal .


package ObjectTasking;

$SIG{ALRM}=sub {
die "timeout";
};

sub new {

my $class=shift;
my $func=shift;
my $args=shift;
my $self={};
$self->{FUNC}=$func;
$self->{ARGS}=$args;
bless($self,$class);
return $self;

}

sub func {
my $self=shift;
my @args=@{ shift @_ };
&{ $self->{FUNC} }(@args);
}

sub multi_task_timer {

my $self=shift;
my $timer=shift;
eval {
my $pid=fork();
alarm $timer;
if($pid) {
$self->func($self->{ARGS});
exit;
}
else {
waitpid($pid,0);
alarm 0;
}
};
if($@=~/timeout/i) {
return "exited";
}
}

sub multi_task {
my $self=shift;
my $pid=fork();
if($pid) {
$self->func($self->{ARGS});
exit;
}
else {
waitpid($pid,0);
}
}

1;

pentru cei care au experienta in perl , codul ar trebui sa fie destul de usor de inteles . pentru ceilalti pun un exemplu :


use strict;
use warnings;
use ObjectTasking;


my $task=ObjectTasking->new(\&test,["test1"]);
my $result=$task->multi_task_timer(2);
print "here\n";
sleep(1);
if($result eq "exited") {
print "Functia a fost intrerupta\n";
}

sub test {

my @param=@_;
print "@param\n";
sleep(20);
print "sfarsitul functiei\n";

}

E un quick hack pentru cei care nu stiu folosi fork/alarm/threads .

Parametrii unui obiect ObjectTasking sunt referinta spre functie si parametrii ei . Pentru o executie completa se utilizeaza metoda multi_task , pentru a executa functia doar un anumit numar de secunde se utilizeaza metoda multi_task_timer , cu numarul de secunde dupa care executia functiei va fi intrerupta .

Ar fi util sa punem ceva module scrise de noi , care sa usureze din munca zilnica . Ce ziceti ?

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...