Alphaphi has asked for the wisdom of the Perl Monks concerning the following question:

Greetings Monks, I need to write a piece of code that needs to run several Windows commands in parallel. Under Linux I did the same using fork(), and all runs fine. But as fork does not exist under Windows, I am thinking of using the Win32::Process module. What I would like to ask is whether this module is my first choice to do things under Windows 10, or whether there are other modules I should take into consideration for this. What makes me suspicious is that the version number is still 0.16, and the date provided on the CPAN page is Dec 2013. Looks a bit old for me. Would appreciate some hints. Thanks

Replies are listed 'Best First'.
Re: Windows 10 and Win32::Process
by dasgar (Priest) on Jun 27, 2018 at 13:37 UTC
    But as fork does not exist under Windows...

    Actually, you can use fork in Windows. However, Perl will emulate fork by using threads (see this note in perlport).

    When I first was looking into doing things in parallel, I looked at fork and threads. I couldn't get my head wrapped around how to use fork, but I was understanding threads so I started using threads. Later I learned that on Windows, Perl uses threads to emulate fork so I stayed with threads.

    I haven't had any issues using threads, but you do need to keep in mind that not all modules are thread safe. If you do use threads and want to use a worker threads model to limit the number of threads being used, you'll find Thread::Queue to be useful and probably threads::shared as well.

    Another alternative you could consider is MCE, which I have not used. The module's author has helped folks here on PerlMonks with issues in using/learning MCE.

    I am thinking of using the Win32::Process module...What makes me suspicious is that the version number is still 0.16...

    A module that hasn't been updated in a long time does not necessarily mean that it has been neglected. Sometimes a module's author will reach a stage where he/she feels that the module is "complete" and not in need of updating. Although I have not used Win32::Process myself, I have seen some posts where folks are using/suggesting the module, so I wouldn't write off the use of that module just because it hasn't been updated in a while.

      A module that hasn't been updated in a long time does not necessarily mean that it has been neglected...

      +1 for your answers and I absolutely agree with this reasoning. I just wish to note that unfortunately the last two times that I used Win32 to do something both functions were not working properly. It makes me careful using that module. Functions that did not work for me where killing a process and using the millisecond sleep.

        ... the last two times that I used Win32 to do something both functions were not working properly. ... Functions that did not work for me [were] ...

        Just to be clear, do I understand correctly that we're talking about some functions in the Win32::Process module?


        Give a man a fish:  <%-{-{-{-<

Re: Windows 10 and Win32::Process
by Lotus1 (Vicar) on Jun 27, 2018 at 14:26 UTC
Re: Windows 10 and Win32::Process
by Marshall (Canon) on Jun 27, 2018 at 18:09 UTC
    Its been years since I looked at a similar issue, but perhaps another idea for you would be to launch the external command with open() and then use async I/O to read the file handle, perhaps with sysread()? If you use normal buffered synchronous I/O the file handle will "block". Just and idea that might be worth considering. I've done async I/O with Perl before, but its been years ago and I am hazy on the details, but I remember that it worked.