При использовании заданий Powershell, пространств выполнения или рабочих процессов выполняются ли потоки на отдельных ядрах? - PullRequest
0 голосов
/ 16 ноября 2018

При использовании заданий Powershell, пространств выполнения или рабочих процессов выполняются ли потоки на отдельных ядрах?(и если да, то как мы можем сказать PowerShell, сколько ядер использовать? - извините, это 2 вопроса.)

.Net имеет библиотеку параллельных задач, которая позволяет параллельно выполнять цикл for,используя все доступные ядра (, вот один пример ).Работают ли Powershell Jobs, Runspaces или Workflows что-то подобное?И, похоже, я имею в виду, что потоки фактически работают на отдельных ядрах параллельно?

Я нашел похожий вопрос здесь , но мне кажется неясным (в любом случае мне), являются ли потокивыполнен на отдельных ядрах.Кажется, что иногда многопоточность ошибочно принимается за параллелизм, как упоминалось здесь .

Если использование нескольких ядер с Powershell невозможно, я буду использовать C # или, возможно, Python, но мой первый выбориспользовать Powershell, потому что (вставьте длинный список причин).

Если это уместно, я пытаюсь сделать все это, чтобы помочь коллеге, который занимается администрированием типа сервера.В настоящее время его скрипт powershell просматривает список серверов, и каждый сервер делает что-то.В настоящее время скрипт работает на 8-ядерном компьютере, но использует только одно ядро.Я уверен, что есть и другие способы повысить производительность, но моя цель - сделать это параллельно.

1 Ответ

0 голосов
/ 16 ноября 2018

Я бы сказал, что да, если под отдельными ядрами вы подразумеваете логические ядра (а не физические ядра).Запустите что-то вроде этого и обратите внимание на вывод «$ num».$ 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'"

    # 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...