PowerShell の並列処理を試してみた

2020/04/18

並列処理を試す

非同期処理より簡単に導入できそうだったので、PowerShell での並列処理を試してみました

例文での共通部分

3 秒スリープ後、引数で受け取った文字を表示します

function Do-Process()
{
    param(
        [string]
        $text
    )

    $wait = 3
    Start-Sleep -Seconds $wait
    Write-Host "$text, Wait:$wait"
}

同期処理(通常の処理)

5 回 Do-Process を呼び出す(同期処理)

function Test-Sync()
{
    foreach ($i in 1..5) {
        Do-Process "Process ${i}"
    }
}

# 実行
$time = Measure-Command {
    Test-Sync
}

実行結果

Process 1, Wait:3
Process 2, Wait:3
Process 3, Wait:3
Process 4, Wait:3
Process 5, Wait:3
15029.085

予定通り 15 秒かかっている

並列処理

5 回 Do-Process を呼び出す(並列処理)

Workflow Test-Parallel()
{
    foreach -parallel ($i in 1..5) {
        Do-Process "Process ${i}"
    }
}

# 並列処理で実行
$time = Measure-Command {
    Test-Parallel
}
$time.TotalMilliseconds

1回目の実行結果

Process 5, Wait:3
Process 3, Wait:3
Process 4, Wait:3
Process 2, Wait:3
Process 1, Wait:3
11181.2299

3 秒強の予定だったが 11 秒もかかっている

2回目の実行

Process 5, Wait:3
Process 4, Wait:3
Process 2, Wait:3
Process 1, Wait:3
Process 3, Wait:3
3754.6529

今度は予定通りの 3 秒強だったが最初は何故時間がかかるんだろう?

参考