在powershell中并行运行任务
我有这样一个PowerShell脚本:在powershell中并行运行任务,powershell,foreach,parallel-processing,task,Powershell,Foreach,Parallel Processing,Task,我有这样一个PowerShell脚本: Foreach ($file in $files) { [Do something] [Do something] [Do something] } 这样,一个文件被依次处理。我想同时处理4个文件 我知道foreach-parallel循环,但它可以并行执行[do something]任务。我基本上希望并行运行整个foreach循环 如何在PowerShell中实现这一点?根据,ForEach-Parallel…将为每个项目并行处
Foreach ($file in $files) {
[Do something]
[Do something]
[Do something]
}
这样,一个文件被依次处理。我想同时处理4个文件
我知道foreach-parallel循环,但它可以并行执行[do something]任务。我基本上希望并行运行整个foreach循环
如何在PowerShell中实现这一点?根据,ForEach-Parallel…
将为每个项目并行处理整个脚本块,但脚本块中的命令将按顺序处理(尽管如果用Parallel{…}
括起来,它们可能会并行化)。但是,您的脚本必须是PowerShell工作流才能被接受;Parallel
和Sequence
关键字仅在工作流中有效。您可以查看或。以下是一个工作示例:
$block = {
Param([string] $file)
"[Do something]"
}
#Remove all jobs
Get-Job | Remove-Job
$MaxThreads = 4
#Start the jobs. Max 4 jobs running simultaneously.
foreach($file in $files){
While ($(Get-Job -state running).count -ge $MaxThreads){
Start-Sleep -Milliseconds 3
}
Start-Job -Scriptblock $Block -ArgumentList $file
}
#Wait for all jobs to finish.
While ($(Get-Job -State Running).count -gt 0){
start-sleep 1
}
#Get information from each job.
foreach($job in Get-Job){
$info= Receive-Job -Id ($job.Id)
}
#Remove all jobs created.
Get-Job | Remove-Job
在上面的代码中,每个$file
并行运行(最多4个同时运行)
编辑:作为对评论的回应,这里有一些关于脚本块的文档。之所以必须包含参数,原因很简单,因为与PowerShell函数不同,scriptblocks不能在大括号{}之外指定参数。PowerShell 7引入了
foreach对象-parallel
:
你的剧本会说
$files| ForEach对象-并行{
[做点什么]
[做点什么]
[做点什么]
}
做得很好,不过我建议使用Wait-Job
cmdlet,而不是使用包含的所有花哨逻辑来获取正在运行的作业并等待它们完成。哦,您可能应该解释一下为什么必须将$file
参数传递到scriptblock中。我将在以后的脚本中对此进行研究。我不知道存在等待作业
。这种使用作业的方法加载和筛选文件的速度要慢得多。我认为这会更快,因为可以同时加载和过滤4个文件。但实际上,一个文件接一个地加载和过滤要快得多。你怎么解释呢?有没有办法让它更快?您愿意添加一个使用运行空间的示例吗?我正在阅读并尝试将您的作业示例转换为使用运行空间,但无法理解。From:介绍Windows PowerShell工作流中的ForEach-并行语言构造。如果未使用工作流,则-Parallel参数不存在。我没有感觉到OP正在处理工作流。@tommymaynard-是的,并行
开关和构造只适用于工作流,我注意到了这一点。质询者在他的问题中确实提到了Foreach-parallel的结构,但似乎误解了其效果,因此我假设工作流是一种可能性,并在此基础上进行了回答。如果他不是,好奇的人给出的工作解决方案可能是一条出路。你完全正确,你提到了工作流。对不起!