Start-ThreadJob

cmdlet과 Start-Job 유사한 백그라운드 작업을 만듭니다.

Syntax

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 는 명령줄의 마지막 매개 변수여야 합니다. 매개 변수 이름을 따르는 모든 값은 인수 목록에서 해석된 값입니다.

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

새 작업의 이름을 지정합니다. 이 이름을 사용하여 cmdlet과 같은 다른 작업 cmdlet에 대한 작업을 식별할 Stop-Job 수 있습니다.

기본 이름은 "Job#"입니다. 여기서 "#"은 각 작업에 대해 증가하는 서수입니다.

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

-ScriptBlock

백그라운드 작업에서 실행할 명령을 지정합니다. 명령을 중괄호({})로 묶어 스크립트 블록을 만듭니다. 자동 변수를 $Input 사용하여 InputObject 매개 변수의 값에 액세스합니다. 이 매개 변수는 필수입니다.

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 세션에 전역으로 적용됩니다. 한 호출에서 ThrottleLimit 를 지정하면 동일한 세션의 후속 호출에 대한 제한이 설정됩니다.

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

입력

PSObject

출력

ThreadJob.ThreadJob