다음을 통해 공유


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를 참조하세요.

입력

PSObject

출력

ThreadJob.ThreadJob