-2

perlスクリプトで他の4つのperlスクリプトをWindowsで実行する方法を見つけて、すべてが完了したら、5番目のスクリプトを開始します。私はたくさんのことをチェックしましたが、どれも簡単ではないようです。提案を歓迎します。スクリプトはWindowsボックスで実行されます。スクリプト1〜4は、スクリプト5を開始する前に最初に終了する必要があります

4

3 に答える 3

1
  1. Accept answers to your other questions

  2. use threads

    2.1. kick of the 4 scripts:

    my @scripts = qw(... commands ...);
    my @jobs = ();
    foreach my $script (@scripts) {
      my $job = threads->create( sub {
        system($script);
      });
      push @jobs, $job;
    }
    

    2.2. Wait for completition

    $_->join() foreach @jobs;
    

    2.3. Kick off the last script

Edit

As you indicated that my solution didn't work for you, I fired up my Windoze box, taught me to use this horrible cmd.exe and wrote following test script. It is a bit simplified over over the above solution, but does meet your requirements about sequentiality etc.

#!/usr/bin/perl
use strict; use warnings; use threads;

my @scripts = (
  q(echo "script 1 reporting"),
  q(perl -e "sleep 2; print qq{hi there! This is script 2 reporting\n}"),
  q(echo "script 3 reporting"),
);

my @jobs = map {
  threads->create(sub{
    system($_);
  });
} @scripts;

$_->join foreach @jobs;

print "finished all my jobs\n";

system q(echo "This is the last job");

I used this command to execute the script (on Win7 with Strawberry Perl v5.12.2):

C:\...>perl stackoverflow.pl

And this is the output:

"script 1 reporting"
"script 3 reporting"
hi there! This is script 2 reporting
finished all my jobs
"This is the last job"

So how on earth does this not work? I would very much like to learn circumventing Perl's pitfalls the next time I write a script on a non-GNU system, so please enlighten me about what can go wrong.

于 2012-09-11T19:36:52.433 に答える
0
use Proc::Background;

my @commands = (
  ['./Files1.exe ALL'],
  ['./Files2.exe ALL'],
  ['./Files3.exe ALL'],
  ['./Files4.exe ALL'],
); 

my @procs = map {  Proc::Background->new(@$_) } @commands;

$_->wait for @procs;

system 'echo', 'CSCProc', '--pidsAndExitStatus', map { $_->pid, $_->wait } @procs;

`mergefiles.exe`;
于 2012-09-12T15:18:24.250 に答える
0

個人的な経験からfork()、ActiveState Perl を使用すると、常にプロセスが順番に実行されるとは限りません。そこで使用されるスレッド化されたシミュレーションはfork()、すべてのプロセスを開始し、特定のポイントに到達してから、一度に 1 つずつ実行するようです。これは、マルチコア CPU でも当てはまります。Straberry Perl も同じようにコンパイルされていると思います。また、fork()はまだバッククォートに使用されていることに注意しsystem()てください。これは単に抽象化されているだけです。

Windows で Cygwin Perl を使用すると、Cygwin 自体のfork()呼び出しによって実行され、適切に並列化されます。ただし、Cygwin は別の点で低速です。

于 2012-09-11T19:49:22.380 に答える