Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

wait is broken on win32?

by xiaoyafeng (Chaplain)
on Apr 26, 2009 at 03:42 UTC ( #760086=perlquestion: print w/ replies, xml ) Need Help??
xiaoyafeng has asked for the wisdom of the Perl Monks concerning the following question:

Hi monks,

I have a script works well on Unix but is broken on Win32. I've found wait function might be the devil. Below is my test snippet:

use strict; use warnings; my $max_process = 10; my $processes = 0; for my $count (1..100){ wait if $processes >= $max_process; do{print $count."\n";exit} unless my $pid = fork; $processes ++; }

I hope it print 1 to 100 in turn, but the output is totally insane. Eventually it print 'out of memory' and crash. I guess the reason is wait can't treat negative pid number correctly.

So my question is whether my script could be reused on win32 by a little work or I have to totally rewrite it in thread?

Thanks!


I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction

Comment on wait is broken on win32?
Download Code
Re: wait is broken on win32?
by ikegami (Pope) on Apr 26, 2009 at 04:04 UTC

    I hope it print 1 to 100 in turn

    There's no reason to expect that.

    Process 1 launches process 1.1 and prints 1
    Process 1 launches process 1.2 and prints 2
    Process 1 launches process 1.3 and prints 3
    ...

    Independently,
    Process 1.1 launches process 1.1.1 and prints 2
    Process 1.1 launches process 1.1.2 and prints 3
    Process 1.1 launches process 1.1.3 and prints 4
    ...

    Independently,
    Process 1.2 launches process 1.2.1 and prints 3
    Process 1.2 launches process 1.2.2 and prints 4
    Process 1.2 launches process 1.2.3 and prints 5
    ...

    Independently,
    Process 1.1.1 launches process 1.1.1.1 and prints 3
    Process 1.1.1 launches process 1.1.1.2 and prints 4
    Process 1.1.1 launches process 1.1.1.3 and prints 5
    ...

    ...

    Aside from printing the same numbers more than once, there's no concurrency control to ensure they happen in order.

    Are you re-inventing Parallel::ForkManager?

    Eventually it print 'out of memory' and crash.

    By my quick count, your code results in up to 56 processes (unix) or threads (Windows) executing simultaneously. That's not a small number.

    So my question is whether my script could be reused on win32 by a little work or I have to totally rewrite it in thread?

    You are already using threads. fork creates threads on Windows.

      Sorry, I overlook 'exit' child process after forked. I've added it, but the output don't show as I hope yet.

      Are you re-inventing Parallel::ForkManager?
      NO, I just want to reuse my script ;)


      I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction

        Come on! Run your program before posting it. It's still broken.

        When I add the missing parens, it prints 1 to 100 (in order) on both Windows and Linux. No crashes. I tried many versions all the way back to 5.6.0 on Windows.

        Note that it's possible that the numbers get printed out of order if one child executes faster than another. This can happen regardless of the OS. You can see it happen using the following code:

        use strict; use warnings; my $max_process = 10; my $processes = 0; for my $count (1..100){ wait if $processes >= $max_process; sleep(rand(3)),print($count."\n"),exit unless my $pid = fork; $processes ++; }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://760086]
Approved by ikegami
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (6)
As of 2014-07-13 23:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (252 votes), past polls