programing

파워셸의 스레드는 어떻게 작동합니까?

muds 2023. 9. 3. 16:39
반응형

파워셸의 스레드는 어떻게 작동합니까?

일부 파일 구문 분석 작업을 PowerShell의 네트워크 작업과 병렬로 수행하려고 합니다.빠른 Google, 시작 스레드는 솔루션처럼 보였지만, 다음과 같습니다.

'start-thread'라는 용어는 cmdlet, 함수, 스크립트 파일 또는 작동 가능한 프로그램의 이름으로 인식되지 않습니다.이름의 철자를 확인하거나 경로가 포함된 경우 경로가 올바른지 확인한 후 다시 시도하십시오.

제가 창업을 시도했을 때도 같은 일이 일어났습니다.

저는 또한 시스템을 만지작거리기도 했습니다.스레드화.스레드

[System.Reflection.Assembly]::LoadWithPartialName("System.Threading")
#This next errors, something about the arguments I can't figure out from the documentation of .NET
$tstart = new-object System.Threading.ThreadStart({DoSomething}) 
$thread = new-object System.Threading.Thread($tstart) 
$thread.Start()

그래서, 제 생각에 가장 좋은 것은 제가 시작 스레드를 사용할 때 무엇을 잘못하는지 아는 것입니다. 왜냐하면 그것은 다른 사람들에게 효과가 있는 것 같기 때문입니다.v2.0을 사용하므로 하위 호환성이 필요하지 않습니다.

Powershell에는 Start-Thread라는 기본 제공 명령이 없습니다.

그러나 V2.0에는 백그라운드에서 실행할 수 있는 PowerShell 작업이 있으며 스레드와 동등한 것으로 간주할 수 있습니다.작업을 수행할 때는 다음 명령을 사용할 수 있습니다.

Name                              Category  Synopsis
----                              --------  --------
Start-Job                         Cmdlet    Starts a Windows PowerShell background job.
Get-Job                           Cmdlet    Gets Windows PowerShell background jobs that are running in the current ...
Receive-Job                       Cmdlet    Gets the results of the Windows PowerShell background jobs in the curren...
Stop-Job                          Cmdlet    Stops a Windows PowerShell background job.
Wait-Job                          Cmdlet    Suppresses the command prompt until one or all of the Windows PowerShell...
Remove-Job                        Cmdlet    Deletes a Windows PowerShell background job.

다음은 사용 방법에 대한 예입니다.작업을 시작하려면 start-job을 사용하고 비동기식으로 실행할 코드가 포함된 스크립트 블록을 전달합니다.

$job  = start-job { get-childitem . -recurse }

이 명령은 작업을 시작하여 현재 디렉터리 아래의 모든 하위 항목을 재귀적으로 가져오고 사용자는 즉시 명령줄로 돌아갑니다.

검사할 수 있습니다.$job작업이 완료되었는지 등을 확인하는 변수입니다.작업이 완료될 때까지 기다리려면 다음을 사용합니다.

wait-job $job

마지막으로 작업에서 결과를 받으려면 다음을 사용합니다.

receive-job $job

이렇게 스레드를 직접 사용할 수는 없지만, 일단 BCL 전체가 여러분 앞에 놓여 있기 때문에 대부분이 작동할 것으로 기대하는 것은 완전히 바보는 아니기 때문에 시도했다고 비난할 수는 없습니다.

PowerShell은 스크립트 블록을 파이프라인에서 실행하므로 스크립트 블록을 실행하려면 런타임 공간이 필요합니다.얼마 전에 v2 ctp3용으로 직접 MT 스크립트를 롤하는 방법에 대해 블로그에 올렸지만, 기술(및 API)은 여전히 동일합니다.주요 도구는 다음과 같습니다.[runspacefactory]그리고.[powershell]유형. 여기를 보십시오.

http://www.nivot.org/2009/01/22/CTP3TheRunspaceFactoryAndPowerShellAccelerators.aspx

위는 MT 스크립팅에 접근하는 가장 가벼운 방법입니다.v2에는 창업, 취업 등의 방법으로 백그라운드 취업 지원이 있지만, 저는 당신이 이미 그것을 발견하고 그들이 상당히 무거운 것을 보았다고 생각합니다.

스레드에 가장 가깝고 작업보다 훨씬 성능이 뛰어난 것은 PowerShell 런스페이스입니다.

다음은 매우 기본적인 예입니다.

# the number of threads
$count = 10

# the pool will manage the parallel execution
$pool = [RunspaceFactory]::CreateRunspacePool(1, $count)
$pool.Open()

try {        
    # create and run the jobs to be run in parallel
    $jobs = New-Object object[] $count
    for ($i = 0; $i -lt $count; $i++) {
        $ps = [PowerShell]::Create()
        $ps.RunspacePool = $pool

        # add the script block to run
        [void]$ps.AddScript({
            param($Index)
            Write-Output "Index: $index"
        })

        # optional: add parameters
        [void]$ps.AddParameter("Index", $i)

        # start async execution
        $jobs[$i] = [PSCustomObject]@{
            PowerShell = $ps
            AsyncResult = $ps.BeginInvoke()
        }
    }
    foreach ($job in $jobs) {
        try {
            # wait for completion
            [void]$job.AsyncResult.AsyncWaitHandle.WaitOne()

            # get results
            $job.PowerShell.EndInvoke($job.AsyncResult)
        }
        finally {
            $job.PowerShell.Dispose()
        }
    }
}
finally {
    $pool.Dispose()
}

또한 다음과 같은 고급 작업을 수행할 수 있습니다.

  • 풀의 병렬 실행 공간 수 조절
  • 현재 세션에서 함수 및 변수 가져오기

기타.

Microsoft Docs에 따르면 모듈에 대한 답은 매우 간단합니다.

Install-Module -Name ThreadJob -Confirm:$true

$Job1 = Start-ThreadJob `
                -FilePath $YourThreadJob `
                -ArgumentList @("A", "B")
$Job1 | Get-Job
$Job1 | Receive-Job

언급URL : https://stackoverflow.com/questions/3325911/how-does-threading-in-powershell-work

반응형