2012-02-03 16 views
0

私は8つのpowershellスクリプトを持っています。依存関係のあるものはほとんどありません。つまり、並列に実行することはできません。彼らは次々に執行されるべきです。powershellスクリプト実行の並列化

Powershellスクリプトには依存関係がなく、並列実行が可能です。私は手動でハード依存関係を符号化することによって可能であることを知っていた詳細に

Powershell scripts 1, 2, and 3 depend on nothing else 
    Powershell script 4 depends on Powershell script 1 
    Powershell script 5 depends on Powershell scripts 1, 2, and 3 
    Powershell script 6 depends on Powershell scripts 3 and 4 
    Powershell script 7 depends on Powershell scripts 5 and 6 
    Powershell script 8 depends on Powershell script 5 

を説明した後

が依存関係です。しかし、10個のPowerShellスクリプトが追加され、それらの間の依存関係が追加される可能性があります。

依存性を見つけることによって、並列並列性を実現していますか?もしそうなら、進め方を教えてください。

答えて

1

あなたは一般的に並列プログラミングに精通していますか? mutual exclusionのコンセプトについて聞いたことがありますか?一般的な概念は、さまざまな並列スレッド間で共有リソースを保護するために、ある種のメッセージング/ロックメカニズムを使用することです。

あなたの場合は、分割線をスクリプトそのものにしています。これは、ウィキペディアの記事で概説されているほとんどのテクニックよりもはるかに単純なものになると思います。この単純なテンプレートは、あなたが探しているもののために働くでしょうか?

  1. ローカルファイルシステムにフォルダを定義します。この場所はすべてのスクリプトに認識されます(デフォルトのパラメータ)。
  2. スクリプトを実行する前に、そのディレクトリ内のファイルがすべて削除されていることを確認してください。
  3. 各スクリプトについて、実行の最後のステップとして、スクリプト名をファイルの名前として共有ディレクトリに書き込む必要があります。したがって、script1.ps1はscript1ファイルを作成します。
  4. 別のスクリプトに依存するスクリプトは、スクリプトのファイル名に関してこれらの依存関係を定義します。 script3がscript1とscript2に依存する場合、これはscript3の依存関係パラメータとして定義されます。
  5. 依存関係のあるすべてのスクリプトは、それが依存するスクリプトのファイルが存在するかどうかをチェックする関数を実行します。そうであれば、スクリプトの実行に進みます。それ以外の場合は、スクリプトが完了するまで一時停止します。
  6. すべてのスクリプトは、マスタースクリプト/バッチファイルによって同時にキックオフされます。すべてのスクリプトはPowerShellジョブとして実行されるため、OSは実行を並行して実行します。ほとんどのスクリプトは起動し、依存関係があることを確認してから、スクリプト本体の実際の実行を続行する前に、これらの問題が解決するまで忍耐強く待ってください。

これは、柔軟性のある依存関係の変更を可能にすることです。すべてのスクリプトはファイルを書きます。誰かがそれらを待っているかどうかについては何の前提もありません。特定のスクリプトの依存関係を変更することは、単純な1行の変更または入力パラメータの変更になります。

これは間違いなく完全な解決策ではありません。たとえば、スクリプトが失敗した場合(またはスクリプトが複数の異なるコードパスで終了する可能性がありますが、そのうちの1つにファイルを書き込むことを忘れた場合)はどうなりますか?これにより、依存するスクリプトが実行されないデッドロック状況が発生する可能性があります。もう一つの悪いことは、正しいファイルが作成されるのを待っている間に、スリープまたはスピンしているのを待っていることです。これは、OSが変更のためにディレクトリを監視するようにEvent-basedアプローチを実装することで修正できます。

これは役立ちますが、すべてがゴミではありません。

+0

それはちょうど答えではない、あなたは私に並列性について深刻すぎると考えさせました。あなたの素晴らしい答えに感謝します。 – Samselvaprabu

1

あなたはちょうどあなたの呼び出しを適切に注文する必要があります。依存関係を処理する組み込み関数はありません。

同時に1,2,3を実行する。Start-Job。同時に実行4,5彼らはGet-Job -State Running | Wait-Job

実験6を行って、それを待って取得することについてStart-Job

待ちをGet-Job -State Running | Wait-Job

を成し遂げるために彼らのために

待ちます。同時に

ラン7、8 Start-Job

+0

あなたの言いたいのは、ハードコーディングのようなものです。さらにいくつかのスクリプトファイルが追加され、依存関係が変更される可能性があります。アルゴリズムによってはうまくいく場合もあります。 – Samselvaprabu

5

あなたはPowerShellの3.0ワークフローを見てする必要があります。要件に必要な機能を提供します。このようなもの:

workflow Install-myApp { 
    param ([string[]]$computername) 
    foreach -parallel($computer in $computername) { 
     "Installing MyApp on $computer" 
     #Code for invoking installer here 
     #This can take as long as 30mins and may reboot a couple of times 
    } 
} 

workflow Install-MyApp2{ 
    param ([string[]]$computername) 
    foreach -parallel($computer in $computername) { 
     "Installing MyApp2 on $computer" 
     #Code for invoking installer here 
     #This can take as long as 30mins! 
    } 
} 

WorkFlow New-SPFarm { 
    Sequence { 
     Parallel { 
      Install-MyApp2 -computername "Server2","Server3" 
      Install-MyApp -computername "Server1","Server4","Server5" 
     } 
     Sequence { 
      #This activity can happen only after the set of activities in the above parallel block are complete" 
      "Configuring First Server in the Farm [Server1]" 

      #The following foreach should take place only after the above activity is complete and that is why we have it in a sequence 
      foreach -parallel($computer in $computername) { 
       "Configuring SharePoint on $computer" 
      } 
     } 
    } 
} 
+0

素晴らしいチップ。私はそれがいくつかのアルゴリズムの少しの追加で達成されると思います。 – Samselvaprabu

+1

ワークフローの良い呼び出し:-)これは、広く利用できるようになると素晴らしい機能になります。 OPは、バックグラウンドジョブに必要なものと同じ並行グループ化と順次グループ化の順序を手動でレイアウトする必要があります。 Windowsのサービス依存関係がどのように動作して、SCMを使用してスタートアップの注文を管理するかのようなものを探していると思います。 –

+0

実際に、シーケンシャルアクティビティと並列アクティビティの適切な順序を使用して達成できます。私は本当に彼が探している正確な順序を見て気にしなかった。しかし、この汎用テンプレートは良い出発点にすべきです。 – ravikanth

関連する問題