2

これが私の問題です:

時間をかけて作成された 100 個の perl スクリプトがあります。各スクリプトには独自の時間がかかります (5 分から 5 時間)。

現在、これらすべてのスクリプトをコマンド プロンプトからスイートとして順次実行していますが、すべてを実行するには 1.5 日近くかかります。

100 個のコマンド プロンプトを同時に開くことができるかどうか、および各コマンド プロンプトで 1 つの perl スクリプトを並行して実行できるかどうか疑問に思っています...すべてのスクリプトを 5 時間 (1 つのスクリプトにかかる最大時間) で完了することができます。

これはどのツールでも可能ですか?

上記を実現するためにマルチスレッドを使用できますか?

より良いアプローチ方法を提案してください。

4

3 に答える 3

2

これらの複数のスクリプトを定期的に実行する必要がある場合は、それらを呼び出すシェル スクリプトを作成することを検討してください。または、makefile を作成することもできます。

さまざまなスクリプト間に依存関係があり、「<em>fooの前に実行する必要がある」と表現する必要がある場合は、makefile を使用する必要がありますbar。プログラムは、makeこれらの依存関係を満たす正しい順序を自動的に見つけます。また、開始する並列ジョブの数を指定することもできますmake: make -j 44 つの並列ジョブの場合。

メイクファイルは、依存関係と本体を持つレシピで構成されます。本文では、各行がシェル コマンドと見なされます。コマンドは端末に出力されてから実行されます。印刷を抑制するには、コマンドの前に を付け@ます。例:

foo: bar something_else
<tab    >@ echo "I am about to execute the foo command:"
<tab    >perl /some/path/foo.pl

bar:
<tab    >@ echo "I am about to execute the bar:"
<tab    >perl /some/path/bar.pl

something_else
<tab    >perl /some/path/something.pl | perl /some/path/else.pl >/some/path/output.txt

をリテラルの<tab >タブ文字に変更する必要があります。空白による意図は機能しません。

このソリューションの欠点は、makefile が単純なシェル スクリプトの 3 倍の長さになることです。利点は、必要な並列ジョブの数を直接指定できることです (これにより、アイドリングをあまり行わずに負荷が均一になります) 。Klas Lindbäckが回答で提案したように、スクリプトを手動で並べ替える必要はありません。make実際の依存関係を指定するだけです。

于 2013-11-12T14:03:42.130 に答える
2

スクリプトを並行して開始するのは簡単です。

Linux/Unix では、コマンドをバックグラウンドで開始するには、各コマンドの最後にアンパサンドを追加するだけです。

例:

myscript &

次の 2 点に注意する必要があります。

一部のスクリプトは相互に依存関係があるため、他のスクリプトが完了するまで開始しないでください。

複数のスクリプトを並行して実行するとボトルネックが発生するため、合計時間が 5 時間より長くなる場合があります。

最初の問題は、依存スクリプトをスクリプト ファイルにグループ化することで解決されます。開始スクリプトは次のようになります。

#!/bin/sh
perl script1 &
perl script2 &
script_group1 &
script_group2 &
...

スクリプト グループは次のようになります。

#!/bin/sh
# Note that there is no '&' at the end of these lines,
# because they need to run consecutively:
perl dependentscript1 
perl dependentscript2
perl dependentscript3 
于 2013-11-12T12:43:41.310 に答える