使用Powershell作业,运行空间或工作流时,线程是否在单独的内核上执行? (如果是这样,我们如何告诉Powershell使用多少个内核?–抱歉,这是两个问题。)
.Net具有任务并行库,该库允许使用所有可用核(here is one example)并行运行“ for循环”。 Powershell作业,运行空间或工作流是否执行类似的操作?同样,我的意思是线程实际上是在并行的独立内核上运行的吗?
我发现了类似的问题here,但是(无论如何对我来说)似乎不清楚线程是否在单独的内核上执行。如here所述,有时似乎多线程被误认为并行。
如果无法在Powershell中使用多个内核,我将使用C#或Python,但是我的首选是使用Powershell,因为(插入一长串原因)。
如果有必要,我正在尝试做所有这些事情来帮助从事服务器管理员工作的同事。当前,他的powershell脚本遍历服务器列表,而foreach服务器可以完成工作。当前,该脚本在8核计算机上运行,但仅使用一个核。我敢肯定还有其他提高性能的方法,但是并行执行是我当前的目标。
答案 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