当使用PowerShell Jobs、Runspaces或Workflows时,线程是否在不同的核心上执行?

5 浏览
0 Comments

当使用PowerShell Jobs、Runspaces或Workflows时,线程是否在不同的核心上执行?

当使用Powershell的作业(Jobs)、运行空间(Runspaces)或工作流(Workflows)时,这些线程是否在独立的核心上执行?(如果是的话,我们如何告诉Powershell使用多少个核心? - 抱歉这是两个问题。)

.Net拥有任务并行库(Task Parallel Library),它允许“for循环”并行运行,利用所有可用的核心(这里有一个例子)。Powershell的作业、运行空间或工作流是否有类似的功能?我所说的类似是指这些线程实际上是否在独立的核心上并行运行?

我在这里找到了一个类似的问题here,但对我来说似乎不清楚这些线程是否在独立的核心上执行。有时候多线程被误认为是并行的,如here所提到的。

如果不能在Powershell中使用多个核心,我将使用C#或者可能是Python,但我的首选是使用Powershell,因为(插入长长的理由列表)。

如果这相关的话,我正在尝试完成所有这些来帮助一位从事服务器管理类型工作的同事。目前,他的Powershell脚本循环遍历服务器列表,并为每个服务器执行一些操作。目前,这个脚本在一台8核的机器上运行,但只使用了一个核心。我相信还有其他提升性能的方法,但目前我的目标是通过并行执行来实现。

0
0 Comments

当使用PowerShell Jobs、Runspaces或Workflows时,线程是否在单独的核心上执行?

问题的原因是要确定在使用PowerShell Jobs、Runspaces或Workflows时,线程是否在单独的核心上执行。解决方法是通过运行一个脚本来观察输出结果,脚本中的"$num"表示当前逻辑核心的编号。如果脚本在一个双核机器上运行(有4个逻辑核心),"$num"的输出结果将为0、1、2或3。

以下是可以运行的脚本示例:

$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'"
        # 模拟一些可能会使CPU繁忙的工作
        # 可以观察任务管理器中的负载情况
        $result = 1; foreach ($number in 1..1000000) {$result = $result * $number};
        Start-Sleep -Milliseconds 500
    }
}
0..10 | % {
    Start-Job -ScriptBlock $sb -ArgumentList $_
}
Get-Job
# 等待所有任务完成
While (Get-Job -State "Running")
{
    Write-Output "waiting..."
    Start-Sleep 2
}
# 从任务中获取信息
Get-Job | Receive-Job
# 清理任务
Get-Job | Remove-Job

以上脚本创建了一系列任务,并使用Win32 API函数GetCurrentProcessorNumber()获取当前线程所在的逻辑核心编号"$num"。通过观察输出结果,可以判断线程是否在单独的核心上执行。

参考链接:https://superuser.com/questions/1105654/logical-vs-physical-cpu-performance

0