使用Powershell作业,运行空间或工作流时,线程是否在单独的内核上执行?

时间:2018-11-16 03:45:01

标签: powershell parallel-processing

使用Powershell作业,运行空间或工作流时,线程是否在单独的内核上执行? (如果是这样,我们如何告诉Powershell使用多少个内核?–抱歉,这是两个问题。)

.Net具有任务并行库,该库允许使用所有可用核(here is one example)并行运行“ for循环”。 Powershell作业,运行空间或工作流是否执行类似的操作?同样,我的意思是线程实际上是在并行的独立内核上运行的吗?

我发现了类似的问题here,但是(无论如何对我来说)似乎不清楚线程是否在单独的内核上执行。如here所述,有时似乎多线程被误认为并行。

如果无法在Powershell中使用多个内核,我将使用C#或Python,但是我的首选是使用Powershell,因为(插入一长串原因)。

如果有必要,我正在尝试做所有这些事情来帮助从事服务器管理员工作的同事。当前,他的powershell脚本遍历服务器列表,而foreach服务器可以完成工作。当前,该脚本在8核计算机上运行,​​但仅使用一个核。我敢肯定还有其他提高性能的方法,但是并行执行是我当前的目标。

1 个答案:

答案 0 :(得分:1)

如果通过单独的核心,您的意思是逻辑核心(不是物理核心),我会说是。运行类似的内容,并注意“ $ num”的输出。 $ num表示当前正在其上运行线程的逻辑(非物理)内核。如果此脚本在双核计算机(具有4个逻辑核)上运行,则$ num的输出为0、1、2或3。有关逻辑CPU和物理CPU的详细说明,请参见here

$sb = {
    param($sbarg)
$MethodDefinition = @'
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public static extern int GetCurrentProcessorNumber();
'@

    $Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru

    0..10 | % {
    $num = $Kernel32::GetCurrentProcessorNumber() 
    Write-Output "[$sbarg]:[$_] on '$num'"

    # simulate some work that may make the cpu busy
    # perhaps watch in task manager as well to see load
    $result = 1; foreach ($number in 1..1000000) {$result = $result * $number};

    Start-Sleep -Milliseconds 500
    }
}

0..10 | % {
    Start-Job -ScriptBlock $sb -ArgumentList $_
}

Get-Job

# Wait for it all to complete
While (Get-Job -State "Running")
{
    Write-Output "waiting..."
    Start-Sleep 2
}

# Getting the information back from the jobs
Get-Job | Receive-Job

# Clean Up
Get-Job | Remove-Job