检查检查点和并行处理

已完成

工作流允许你在代码中实现复杂的逻辑。 工作流提供的两个功能是检查点和并行处理。

检查站

检查点 是工作流当前状态的快照。

检查点包括变量的当前值,以及在该点之前生成的所有输出。 (有关检查点是什么的详细信息,请阅读 检查点 网页。

如果工作流以错误结束或挂起,则下次运行时,它将从其最后一个检查点开始,而不是在工作流的开头启动。

可以使用 检查点-工作流 活动在工作流中设置检查点。

例如,如果在 Activity2 之后发生异常,工作流将在以下示例代码中结束。

重新运行工作流时,从 Activity2 开始,紧跟在最后一个检查点之后。

    <Activity1>
        Checkpoint-Workflow
            <Activity2>
                <Exception>
            <Activity3>

并行处理

脚本块中具有多个命令(或称并行运行 ),而并非如同典型脚本那样按顺序运行。

它被称为 并行处理。 (有关并行处理的详细信息,请参阅 并行处理 网页。

在以下示例中,将同时启动两个 vm0vm1 VM,而 vm2 将在 vm0vm1 都启动后才启动。

    Parallel
    {
        Start-AzureRmVM -Name $vm0 -ResourceGroupName $rg 
        Start-AzureRmVM -Name $vm1 -ResourceGroupName $rg
    }

    Start-AzureRmVM -Name $vm2 -ResourceGroupName $rg 

另一个并行处理示例是引入一些额外选项的以下构造:

  • ForEach -Parallel。 可以使用 ForEach -Parallel 构造来同时处理集合中每个项的命令。 当脚本块中的命令按顺序运行时,会并行处理集合中的项。

在以下示例中,Activity1 在集合中的所有项中同时开始。

对于每个项目,Activity2Activity1 完成后启动。 Activity3 仅在 Activity1Activity2 均已完成所有项后才会启动。

  • 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."
    }