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