Start-ThreadJob
cmdlet과 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>]
Description
Start-ThreadJob
는 cmdlet과 Start-Job
유사한 백그라운드 작업을 만듭니다. 주요 차이점은 생성된 작업이 로컬 프로세스 내의 별도 스레드에서 실행된다는 것입니다. 기본적으로 작업은 작업을 시작한 호출자의 현재 작업 디렉터리를 사용합니다.
이 cmdlet은 한 번에 실행 중인 작업 수를 제한하는 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-ThreadJob
.Start-Job
작업은 1초 동안 cmdlet을 실행 Start-Sleep
합니다. 작업이 병렬로 실행되므로 총 실행 시간은 약 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를 사용하여 작업 만들기
이 예제에서 스크립트 블록은 변수를 $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 매개 변수를 사용하여 모든 호스트 출력을 특정 호스트로 보내도록 작업에 지시할 수 있습니다. 이 매개 변수가 없으면 출력이 작업 데이터 스트림 컬렉션으로 이동하고 작업에서 출력을 받을 때까지 호스트 콘솔에 표시되지 않습니다.
이 예제에서는 현재 호스트가 자동 변수를 Start-ThreadJob
사용하여 $Host
전달됩니다.
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
표시됩니다. cmdlet은 Receive-Job
작업의 모든 출력을 반환합니다.
예제 5 - 동시에 여러 파일 다운로드
cmdlet은 Invoke-WebRequest
한 번에 하나의 파일만 다운로드할 수 있습니다. 다음 예제에서는 여러 스레드 작업을 만들어 동시에 여러 파일을 다운로드하는 데 사용합니다 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 는 명령줄의 마지막 매개 변수여야 합니다. 매개 변수 이름을 따르는 모든 값은 인수 목록에서 해석된 값입니다.
형식: | Object[] |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-FilePath
백그라운드 작업으로 실행할 스크립트 파일을 지정합니다. 스크립트의 경로와 파일 이름을 입력합니다. 스크립트는 로컬 컴퓨터 또는 로컬 컴퓨터에서 액세스할 수 있는 폴더에 있어야 합니다.
이 매개 변수를 사용하는 경우 PowerShell은 지정된 스크립트 파일의 내용을 스크립트 블록으로 변환하고 스크립트 블록을 백그라운드 작업으로 실행합니다.
형식: | String |
Position: | 0 |
Default value: | None |
필수: | True |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-InitializationScript
작업이 시작되기 전에 실행되는 명령을 지정합니다. 명령을 중괄호({}
)로 묶어 스크립트 블록을 만듭니다.
이 매개 변수를 사용하여 작업이 실행되는 세션을 준비합니다. 예를 들어 이 함수를 사용하여 세션에 함수 및 모듈을 추가할 수 있습니다.
형식: | ScriptBlock |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-InputObject
스크립트 블록에 대한 입력으로 사용되는 개체를 지정합니다. 또한 파이프라인 입력을 허용합니다. 스크립트 블록의 $input
자동 변수를 사용하여 입력 개체에 액세스합니다.
형식: | PSObject |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | True |
와일드카드 문자 허용: | False |
-Name
새 작업의 이름을 지정합니다. 이 이름을 사용하여 cmdlet과 같은 다른 작업 cmdlet에 대한 작업을 식별할 Stop-Job
수 있습니다.
기본 이름은 "Job#"입니다. 여기서 "#"은 각 작업에 대해 증가하는 서수입니다.
형식: | String |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-ScriptBlock
백그라운드 작업에서 실행할 명령을 지정합니다. 명령을 중괄호({}
)로 묶어 스크립트 블록을 만듭니다. 자동 변수를 $Input
사용하여 InputObject 매개 변수의 값에 액세스합니다. 이 매개 변수는 필수입니다.
형식: | ScriptBlock |
Position: | 0 |
Default value: | None |
필수: | True |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-StreamingHost
이 매개 변수는 출력이 PSHost 개체에서 전달된 개체로 직접 이동하도록 허용하는 Write-Host
스레드로부터 안전한 방법을 제공합니다. 출력이 Write-Host
없으면 출력이 작업 정보 데이터 스트림 컬렉션으로 이동하고 작업이 실행을 완료할 때까지 호스트 콘솔에 표시되지 않습니다.
형식: | PSHost |
Position: | Named |
Default value: | None |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
-ThrottleLimit
이 매개 변수는 한 번에 실행 중인 작업 수를 제한합니다. 작업이 시작되면 큐에 대기하고 스레드 풀에서 스레드를 사용하여 작업을 실행할 때까지 기다립니다. 기본 제한은 5개의 스레드입니다.
스레드 풀 크기는 PowerShell 세션에 전역으로 적용됩니다. 한 호출에서 ThrottleLimit 를 지정하면 동일한 세션의 후속 호출에 대한 제한이 설정됩니다.
형식: | Int32 |
Position: | Named |
Default value: | 5 |
필수: | False |
파이프라인 입력 허용: | False |
와일드카드 문자 허용: | False |
입력
출력
ThreadJob.ThreadJob
관련 링크
PowerShell