在PowerShell中使用多线程一次调用多个URL

时间:2013-05-27 12:38:29

标签: multithreading powershell

我有一个其查询更改的网址。查询存储在一个数组中,因此在循环中更改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 个答案:

答案 0 :(得分:2)

您将遇到上述代码的几个问题。脚本块被转移到另一个PowerShell.exe进程以执行,因此它不会访问$查询。你会像这样传递它:

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

另一个问题是你永远不会从$ job中删除已完成的工作,所以一旦这个$jobs.Count -lt 5表达式因为计数达到5而变为假,你就永远不会再添加工作了。尝试这样的事情:

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

然后你最终只能使用$ jobs中正在运行的作业,这将允许你在之前的作业完成(或失败)时开始更多的工作。