in reply to wait is broken on win32?

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.

Replies are listed 'Best First'.
Re^2: wait is broken on win32?
by xiaoyafeng (Deacon) on Apr 26, 2009 at 04:35 UTC

    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 ++; }

        I apologize for my fault! I changed the contents of the script but forgot to save! I'm really ashamed of myself for wasting monks' time. Now I modify the snippet and it works well.

        Many thanks, ikegami!!


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