2013-05-27 2 views
2

쿼리가 변경되는 URL이 하나 있습니다. 쿼리는 배열에 저장되므로 루프 내에서 URL을 변경하는 것은 문제가되지 않습니다 (특정 쿼리에는 관심이 없습니다).powershell에서 멀티 스레드를 사용하여 한 번에 여러 URL 호출

각 URL에 대한 작업을 생성하고 작업 그룹을 동시에 시작하고 모니터링하는 데 어려움이 있습니다.

쿼리 배열을 한 번에 5 개씩 반복하면서 시작할 때마다 5 개의 새 URL을 호출하므로 반복 할 때마다 모든 반복에 해당 반복 요소의 URL이 포함 된 작업 배열이 필요합니다.

제 접근 방법이 맞습니까? 모든 포인터는 감사하겠습니다!

$queries = 1..10 
$jobs = @() 

foreach ($i in $queries) { 
    if ($jobs.Count -lt 5) { 
    $ScriptBlock = { 
     $query = $queries[$i] 
     $path = "http://mywebsite.com/$query" 
     Invoke-WebRequest -Uri $path 
    } 
    $jobs += Start-Job -ScriptBlock $ScriptBlock 
    } else { 
     $jobs | Wait-Job -Any 
    } 
} 
+1

코드를 알려주십시오. – Neolisk

답변

2

당신은 위의 코드에 문제가 몇으로 실행됩니다 :

이 내 접근 방식을 설명하는 샘플 코드입니다. Scriptblock은 다른 PowerShell.exe 프로세스로 전송되어 실행되므로 $ 쿼리에 액세스 할 수 없습니다. 당신은 그것과 같이 되었됩니다

... 
$scriptblock = {param($queries) 
    ... 
} 
... 
$jobs += Start-Job $scriptblock -Arg $queries 

다른 문제는 거짓이 $jobs.Count -lt 5 표현 evals되면 카운트가 5에 도달하기 때문에, 그래서 당신은 $ 작업에서 완료된 작업을 제거하지 않을 것입니다, 당신은 추가 않을거야 더 이상 일자리. 이런 식으로 뭔가를 시도 :

$jobs | Wait-Job -Any 
$jobs = $jobs | Where ($_.State -eq 'Running'} 

그런 다음 당신은 당신이 완전한 이전 작업으로 더 많은 일자리를 시작 (또는 실패) 할 수 $ 작업 만 실행중인 작업과 바람 것입니다.

+0

나는 본다. 나는 그것을 시도했지만 오류가 발생했습니다. '[System.Management.Automation.PSRemotingJob]에 'op_Addition'이라는 메서드가 없기 때문에 메서드 호출이 실패했습니다. '$ jobs + = ...'행을 참조하고 있습니다. 이전에는 오류가 없었습니다. 왜 그런 일이 일어나고 있는지 모르겠다. (나는 최근에 PowerShell로 작업하기 시작했다.) –

+1

항상 $ jobs를 다시 초기화해야한다. '$ jobs = @()'. 또한 실행 사이의 모든 작업을 삭제하십시오. 'Remove-Job * -Force'. –

관련 문제