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 のバックグラウンド ジョブをCreateする
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-Job
。 Start-ThreadJob
は 8 倍高速で、5 つのジョブを作成するのに約 0.6 秒かかっています。 結果は環境によって異なる場合がありますが、相対的な改善は同じである必要があります。
例 3 - InputObject を使用してジョブをCreateする
この例では、スクリプト ブロックは 変数を $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 - 親ホストにジョブ出力をStreamする
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 |
入力
出力
ThreadJob.ThreadJob