in reply to Re^4: Splitting one large timeout into few smaller ones..
in thread Splitting one large timeout into few smaller ones..

A clearer description of the "tasks" in question, the communications requirements etc. would make it easier to make suggestions.

Threads would be in randomly failing department, additionally there are way to many flavors, each with it's own set of problems, advantages and disadvantages.

If we're talking Perl, there are only two flavours and only one of them is worth considering.

It's not hard to arrange for threads to operate cooperatively--it's quite simple actually--but, in common with all forms of cooperative multitasking, you need to embed yeild points within the loops. If you are able to do this, then you could equally embed return unless $timeleft; at those same points and bottle out when the time has expired and move onto the next task.

You seem to be hooked on telling us how Perl cannot help you, rather than helping us tell you how it could.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco.
Rule 1 has a caveat! -- Who broke the cabal?

Replies are listed 'Best First'.
Re^6: Splitting one large timeout into few smaller ones..
by Eyck (Priest) on Apr 07, 2005 at 19:51 UTC
    Which threads flavour is worth considering?

    I don't know how to ask this in more clear way, but my whole post was about embedding those yield points within the loops, that is exactly what I'm trying to do.

    As you say, it's supposed to be simple, but I'm having problems with figuring this one out. If it's not clear from the way I tried to phrase the question, then where do you think I made the mistake?

    As to 'return unless $timeleft', that would be exactly the opposite of what I'm trying to do.

    $sth->stuff(); #NOT return unless $timeleft; #if i'm here, I do not need to return, I can go on
    Sth like
    local $SIG{ALRM}=sub { return; #IE, when ALRM strikes # cut short execution of the routine and just return from #there }; alarm 10;# $sth->stuff(); alarm 0;# if I'm here, I can safely continue
    Or maybe
    sub sth($$) { $SIG{ALRM}=sub { goto SUBEND; #IE, when ALRM strikes # cut short execution of the routine and just return from #there }; #.... #.... alarm 10;# $sth->stuff(); alarm 0;# if I'm here, I can safely continue SUBEND: return; }
    However, using goto seems ugly, and putting return; inside SIG{ALRM} shouldn't work.

    I'm asking if there's a way to make this work.