将两个工作流嵌套在单个工作流中以并行运行

时间:2015-11-13 18:31:00

标签: powershell parallel-processing workflow powershell-v4.0

我确信我不是第一个尝试这个但却找不到一篇关于它的人。

我试图将两个工作流嵌套在一个工作流中,这样两个工作流并行运行,我得到了10个流程。以下是我首先尝试的内容:

Workflow a {
    param(
        [parameter()]alist
    )
    sequence
    {
        $WORKFLOW:aOutput = @()
        foreach ($aObject in $aList)
        {
            $WORKFLOW:aOutput += do_stuff
        }
        return $WORKFLOW:aOutput
    }
)
}
Workflow b {
    param(
        [parameter()]blist
    )
    sequence
    {
        $WORKFLOW:bOutput = @()
        foreach ($bObject in $bList)
        {
            $WORKFLOW:bOutput += do_stuff
        }
        return $WORKFLOW:bOutput
    }
)
}
Workflow nest
{
param(
    [parameter()]alist,
    [parameter()]blist
)
parallel
{
    $aOutput = b -alist alist
    $bOutput = b -blist blist
}
return ($aOutput,$bOutput)
}

这一切都很好但只能旋转5个并行进程而不是10个。所以我尝试了这个:

Workflow nest
{
param(
    [parameter()]alist,
    [parameter()]blist
)
parallel
{
    $aOutput =  inlinescript
    {
        Workflow a {
        param(
            [parameter()]alist
        )
        sequence
        {
            $WORKFLOW:aOutput = @()
            foreach ($aObject in $aList)
            {
                $WORKFLOW:aOutput += do_stuff
            }
            return $WORKFLOW:aOutput
        }
    }
    $bOutput = inlinescript
    {
        Workflow b {
                param(
                    [parameter()]blist
                )
                sequence
                {
                    $WORKFLOW:bOutput = @()
                    foreach ($bObject in $bList)
                    {
                        $WORKFLOW:bOutput += do_stuff
                    }
                    return $WORKFLOW:bOutput
                }
            )
        }
        b -blist blist
    }
}
return ($aOutput,$bOutput)
}

我在这里遇到的问题是在inlinescript块中使用范围WORKFLOW会引发错误。该错误表示使用范围USING而不是当我切换到关于在foreach -parallel块内重新定义变量时出现错误。

我正在寻找的是这可能,如果是这样,需要使用什么范围来嵌套工作流程?或者是否有另一种方法可以让工作流同时运行,每个进程有5个进程?

为伪代码道歉,但实际代码包含我无法分享的信息。

1 个答案:

答案 0 :(得分:2)

我设法弄清楚了,并弄清楚使用USING范围的位置。

Workflow nest
{
param(
    [parameter()]alist,
    [parameter()]blist
)
parallel
{
    $aOutput =  inlinescript
    {
        Workflow a {
        param(
            [parameter()]alist
        )
        sequence
        {
            $aOutput = foreach ($aObject in $aList)
            {
                do_stuff
            }
            return aOutput
        }
        a -alist $USING:alist
    }
    $bOutput = inlinescript
    {
        Workflow b {
                param(
                    [parameter()]blist
                )
                sequence
                {
                    $bOutput = foreach ($bObject in $bList)
                    {
                        do_stuff
                    }
                    return $bOutput
                }
            )
        }
        b -blist $USING:blist
    }
}
return ($aOutput,$bOutput)
}

基本上我删除了在foreach循环中添加的数组定义,并将其设置为等于foreach循环。这完全取消了我对范围的需求。我必须将传递的a / b列表变量从嵌套工作流设置为带有USING范围的inlinescript。