задания PowerShell не выполняются параллельно - PullRequest
0 голосов
/ 07 июня 2018

Ожидается, что это запустится через 5+ секунд (при условии, что у меня есть 4 ядра, и каждое задание может выполняться на каждом ядре).

$emailTimes =  @(0) * 4  

Write-Host "[$(Get-Date -Format HH:mm:ss.fff)] Starting"  
for ($index=0;$index -lt ($emailTimes.length); $index++) {  
  Start-Job -Name "job$index" -ScriptBlock {sleep 5}  
}  
Write-Host "[$(Get-Date -Format HH:mm:ss.fff)] Waiting"  
Get-Job | Wait-Job  
Get-Job | Receive-Job  
Write-Host "[$(Get-Date -Format HH:mm:ss.fff)] Completed"  

1 Ответ

0 голосов
/ 07 июня 2018

Ядра не имеют значения, вы можете запускать 100 заданий с одним ядром параллельно.

То, что я сделал сейчас:

foreach ($i in 1..10 ) { Start-Job -ScriptBlock {SLEEP -Seconds 5} }
MEASURE-COMMAND { Get-Job|Wait-Job }

и заканчивается:

TotalSeconds      : 6,2208058

Пока что - запускаю его несколько раз, как только получу:

TotalSeconds      : 14,3781632

Так что это может быть медленно, но определенно работает параллельно

Я начал проверять это, и яЯ думаю, что OP может быть на что-то.запустили несколько параллельных заданий, например:

    get-job|remove-job
echo "start:"
get-date -UFormat " %H:%M:%S"
1..18| % { 
    Start-Job -ScriptBlock {
        $obj = ""|select starttime, runtime, finishtime 
        $obj.starttime = get-date -UFormat " %H:%M:%S"
        $obj.runtime = measure-command {SLEEP -Seconds 1}|select -ExpandProperty totalseconds
        $obj.finishtime = get-date -UFormat " %H:%M:%S"
        $obj
    } |out-null 

} 
echo "finished spinning up jobs at:"
get-date -UFormat " %H:%M:%S"
echo "all jobs finished at "
Get-Job|Wait-Job |out-null
get-date -UFormat " %H:%M:%S"
echo "run time of each job"

get-job|receive-job| ft

и результат был такой:

start:
 23:04:27
finished spinning up jobs at:
 23:04:31
all jobs finished at
 23:05:23
run time of each job

starttime   runtime finishtime
---------   ------- ----------
 23:05:07 1,0037849  23:05:08
 23:05:07 1,0037791  23:05:08
 23:05:22 1,0036025  23:05:23
 23:05:22 1,0040943  23:05:23
 23:05:22  1,003943  23:05:23
 23:05:22 1,0116236  23:05:23
 23:05:22 1,0217624  23:05:23
 23:05:22 1,0056518  23:05:23
 23:05:22 1,0038563  23:05:23
 23:05:22 1,0082825  23:05:23
 23:05:22 1,0042454  23:05:23
 23:05:22 1,0033923  23:05:23
 23:05:22 1,0128473  23:05:23
 23:05:22 1,0190476  23:05:23
 23:05:22 1,0188348  23:05:23
 23:05:22 1,0235496  23:05:23
 23:05:22 1,0058239  23:05:23
 23:05:22 1,0153528  23:05:23

Обратите внимание: 40-секундная задержка от запуска сценария до начала первого задания и 15-секундный перерывмежду первыми 2 и отдыхом?

Чем больше заданий выполняется параллельно, тем хуже становится.Запуск 100 заданий с 10-секундным сном (так что первый не завершается до того, как все запущено) просто повесил окно PS и никогда не завершал ... что странно, потому что я использовал сотни заданий, каждое из которых занимало более 10 секунд, чтобы завершить иникогда не сталкивался с такими проблемами раньше.

Для этого требуется дальнейшее тестирование различных машин (возможно, ОС / процессора / антивируса?) И разных версий PowerShell.

Я также подумал, что, возможно, это что-то особенное для функции start-sleep, но нет- использовали разные методы, чтобы запустить его несколько секунд и все тот же эффект.Приходится проверять это, потому что я использую задания powershell (в основном, invoke-command -asjob) ежедневно, и если так будет продолжаться - мне может понадобиться переключиться на пространства выполнения или рабочие процессы для моих потребностей параллельной обработки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...