检查检查点和并行处理
工作流允许你在代码中实现复杂的逻辑。 工作流提供的两个功能是检查点和并行处理。
检查站
检查点 是工作流当前状态的快照。
检查点包括变量的当前值,以及在该点之前生成的所有输出。 (有关检查点是什么的详细信息,请阅读 检查点 网页。
如果工作流以错误结束或挂起,则下次运行时,它将从其最后一个检查点开始,而不是在工作流的开头启动。
可以使用 检查点-工作流 活动在工作流中设置检查点。
例如,如果在 Activity2 之后发生异常,工作流将在以下示例代码中结束。
重新运行工作流时,从 Activity2 开始,紧跟在最后一个检查点之后。
<Activity1>
Checkpoint-Workflow
<Activity2>
<Exception>
<Activity3>
并行处理
脚本块中具有多个命令(或称并行运行 ),而并非如同典型脚本那样按顺序运行。
它被称为 并行处理。 (有关并行处理的详细信息,请参阅 并行处理 网页。
在以下示例中,将同时启动两个 vm0 和 vm1 VM,而 vm2 将在 vm0 和 vm1 都启动后才启动。
Parallel
{
Start-AzureRmVM -Name $vm0 -ResourceGroupName $rg
Start-AzureRmVM -Name $vm1 -ResourceGroupName $rg
}
Start-AzureRmVM -Name $vm2 -ResourceGroupName $rg
另一个并行处理示例是引入一些额外选项的以下构造:
- ForEach -Parallel。 可以使用 ForEach -Parallel 构造来同时处理集合中每个项的命令。 当脚本块中的命令按顺序运行时,会并行处理集合中的项。
在以下示例中,Activity1 在集合中的所有项中同时开始。
对于每个项目,Activity2 在 Activity1 完成后启动。 Activity3 仅在 Activity1 和 Activity2 均已完成所有项后才会启动。
- ThrottleLimit - 我们使用 ThrottleLimit 参数来限制并行度。 ThrottleLimit 设置过高可能会造成问题。 ThrottleLimit 参数的理想值取决于多个环境因素。 尝试从低 ThrottleLimit 值开始,然后增加该值,直到找到适用于特定情况的值:
ForEach -Parallel -ThrottleLimit 10 ($<item> in $<collection>)
{
<Activity1>
<Activity2>
}
<Activity3>
实际示例可能类似于以下代码:复制后为每个文件显示一条消息。 只有在复制所有文件后,才会显示完成消息。
Workflow Copy-Files
{
$files = @("C:\LocalPath\File1.txt","C:\LocalPath\File2.txt","C:\LocalPath\File3.txt")
ForEach -Parallel -ThrottleLimit 10 ($File in $Files)
{
Copy-Item -Path $File -Destination \\NetworkPath
Write-Output "$File copied."
}
Write-Output "All files copied."
}