Start-ThreadJob

コマンドレットと同様のバックグラウンド ジョブを Start-Job 作成します。

構文

Start-ThreadJob
     [-ScriptBlock] <ScriptBlock>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [-StreamingHost <PSHost>]
     [<CommonParameters>]
Start-ThreadJob
     [-FilePath] <String>
     [-Name <String>]
     [-InitializationScript <ScriptBlock>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [-ThrottleLimit <Int32>]
     [-StreamingHost <PSHost>]
     [<CommonParameters>]

説明

Start-ThreadJob は、コマンドレットと同様のバックグラウンド ジョブを Start-Job 作成します。 メインの違いは、作成されたジョブがローカル プロセス内の個別のスレッドで実行される点です。 既定では、ジョブはジョブを開始した呼び出し元の現在の作業ディレクトリを使用します。

このコマンドレットでは、一度に実行されるジョブの数を制限する ThrottleLimit パラメーターもサポートされています。 より多くのジョブが開始されると、キューに登録され、現在のジョブ数がスロットル制限を下回るまで待機します。

例 1 - スレッド制限が 2 のバックグラウンド ジョブを作成する

Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } } -ThrottleLimit 2
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Start-ThreadJob -ScriptBlock { 1..100 | % { sleep 1; "Output $_" } }
Get-Job

Id   Name   PSJobTypeName   State        HasMoreData   Location     Command
--   ----   -------------   -----        -----------   --------     -------
1    Job1   ThreadJob       Running      True          PowerShell   1..100 | % { sleep 1;...
2    Job2   ThreadJob       Running      True          PowerShell   1..100 | % { sleep 1;...
3    Job3   ThreadJob       NotStarted   False         PowerShell   1..100 | % { sleep 1;...

例 2 - Start-Job と Start-ThreadJob のパフォーマンスを比較する

この例では、〘と 〘の違 Start-Job いを Start-ThreadJob示します。 ジョブはコマンドレットを Start-Sleep 1 秒間実行します。 ジョブは並列で実行されるため、合計実行時間は約 1 秒に加えて、ジョブの作成に必要な任意の時間です。

# start five background jobs each running 1 second
Measure-Command {1..5 | % {Start-Job {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds
Measure-Command {1..5 | % {Start-ThreadJob {Start-Sleep 1}} | Wait-Job} | Select-Object TotalSeconds

TotalSeconds
------------
   5.7665849
   1.5735008

実行時間として 1 秒を減算すると、5 つのジョブを作成するのに約 4.8 秒かかることがわかります Start-JobStart-ThreadJob は 8 倍高速で、5 つのジョブを作成するのに約 0.6 秒かかっています。 結果は環境によって異なる場合がありますが、相対的な改善は同じである必要があります。

例 3 - InputObject を使用してジョブを作成する

この例では、スクリプト ブロックは変数を$input使用して InputObject パラメーターから入力を受け取ります。 これは、オブジェクト Start-ThreadJobを .

$j = Start-ThreadJob -InputObject (Get-Process pwsh) -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     94   145.80     159.02      18.31   18276   1 pwsh
    101   163.30     222.05      29.00   35928   1 pwsh

$j = Get-Process pwsh | Start-ThreadJob -ScriptBlock { $input | Out-String }
$j | Wait-Job | Receive-Job

NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     94   145.80     159.02      18.31   18276   1 pwsh
    101   163.30     222.05      29.00   35928   1 pwsh

例 4 - ジョブ出力を親ホストにストリーム配信する

StreamingHost パラメーターを使用すると、すべてのホスト出力を特定のホストに送信するようにジョブに指示できます。 このパラメーターを指定しないと、出力はジョブ データ ストリーム コレクションに送信され、ジョブから出力を受け取るまでホスト コンソールには表示されません。

この例では、現在のホストは自動変数を$Host使用してStart-ThreadJob渡されます。

PS> Start-ThreadJob -ScriptBlock { Read-Host 'Say hello'; Write-Warning 'Warning output' } -StreamingHost $Host

Id   Name   PSJobTypeName   State         HasMoreData     Location      Command
--   ----   -------------   -----         -----------     --------      -------
7    Job7   ThreadJob       NotStarted    False           PowerShell    Read-Host 'Say hello'; ...

PS> Say hello: Hello
WARNING: Warning output
PS> Receive-Job -Id 7
Hello
WARNING: Warning output
PS>

プロンプト Read-Host が表示され、入力できることに注意してください。 その後、メッセージが Write-Warning 表示されます。 このコマンドレットは Receive-Job 、ジョブからすべての出力を返します。

例 5 - 複数のファイルを同時にダウンロードする

コマンドレットは Invoke-WebRequest 一度に 1 つのファイルのみをダウンロードできます。 次の例では、 Start-ThreadJob 複数のファイルを同時にダウンロードする複数のスレッド ジョブを作成します。

$baseUri = 'https://github.com/PowerShell/PowerShell/releases/download'
$files = @(
    @{
        Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.msi"
        OutFile = 'PowerShell-7.3.0-preview.5-win-x64.msi'
    },
    @{
        Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.zip"
        OutFile = 'PowerShell-7.3.0-preview.5-win-x64.zip'
    },
    @{
        Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.msi"
        OutFile = 'PowerShell-7.2.5-win-x64.msi'
    },
    @{
        Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.zip"
        OutFile = 'PowerShell-7.2.5-win-x64.zip'
    }
)

$jobs = @()

foreach ($file in $files) {
    $jobs += Start-ThreadJob -Name $file.OutFile -ScriptBlock {
        $params = $using:file
        Invoke-WebRequest @params
    }
}

Write-Host "Downloads started..."
Wait-Job -Job $jobs

foreach ($job in $jobs) {
    Receive-Job -Job $job
}

パラメーター

-ArgumentList

FilePath パラメーターまたは ScriptBlock パラメーターで指定されたスクリプトの引数またはパラメーター値の配列を指定します。

ArgumentList は、コマンド ラインの最後のパラメーターである必要があります。 パラメーター名に続くすべての値は、引数リスト内で解釈される値です。

Type:Object[]
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

バックグラウンド ジョブとして実行するスクリプト ファイルを指定します。 スクリプトのパスとファイル名を入力します。 スクリプトは、ローカル コンピューターまたはローカル コンピューターがアクセスできるフォルダーに存在する必要があります。

このパラメーターを使用すると、PowerShell は指定されたスクリプト ファイルの内容をスクリプト ブロックに変換し、スクリプト ブロックをバックグラウンド ジョブとして実行します。

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

ジョブの開始前に実行するコマンドを指定します。 コマンドを中かっこ ({}) で囲み、スクリプト ブロックを作成します。

このパラメーターは、ジョブを実行するセッションを準備するために使用します。 たとえば、これを使用して、関数とモジュールをセッションに追加できます。

Type:ScriptBlock
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

スクリプト ブロックへの入力として使用されるオブジェクトを指定します。 パイプライン入力も可能です。 スクリプト ブロックの $input 自動変数を使用して、入力オブジェクトにアクセスします。

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-Name

新しいジョブのフレンドリ名を指定します。 この名前を使用して、他のジョブ コマンドレット (コマンドレットなど) にジョブを Stop-Job 識別できます。

既定のフレンドリ名は "Job#" です。ここで、"#" はジョブごとにインクリメントされる序数です。

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

バックグラウンド ジョブで実行するコマンドを指定します。 コマンドを中かっこ ({}) で囲み、スクリプト ブロックを作成します。 InputObject パラメーターの$Input値にアクセスするには、自動変数を使用します。 このパラメーターは必須です。

Type:ScriptBlock
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-StreamingHost

このパラメーターは、渡された PSHost オブジェクトに出力を直接送信できるようにするWrite-Hostスレッド セーフな方法を提供します。 これを指定しないと、 Write-Host 出力はジョブ情報データ ストリーム コレクションに送信され、ジョブの実行が完了するまでホスト コンソールには表示されません。

Type:PSHost
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ThrottleLimit

このパラメーターは、一度に実行されるジョブの数を制限します。 ジョブが開始されると、ジョブはキューに登録され、スレッド プールでスレッドが使用可能になるまで待機してジョブを実行します。 既定の制限は 5 スレッドです。

スレッド プールのサイズは、PowerShell セッションに対してグローバルです。 1 回の 呼び出しで ThrottleLimit を指定すると、同じセッション内の後続の呼び出しの制限が設定されます。

Type:Int32
Position:Named
Default value:5
Required:False
Accept pipeline input:False
Accept wildcard characters:False

入力

PSObject

出力

ThreadJob.ThreadJob