asterisk9101
@asterisk9101

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

whileで処理待ちするときの書き方

Discussion

解決したいこと

レビューをしている際に、何らかの処理待ちをする while ループを書くときにパターンがあるという話をしてしまったのですが、振り返ると経験則でしかありませんでした。例外であるとか、他の書き方のパターンや考え方をご存知であればご教示頂きたいです。

その時に示したパターン(PowerShell)は以下の通り。

# (1)
$result = command
while ($result) {
    # (3)
    if ($timeout -gt 10) { break }

    $timeout++
    sleep 1
    
    # (2)
    $result = command
}
# (4)
if ($timeout -gt 10) {
    # ...
}

(1)(2) は何らかの処理状態を取得するコマンドであり、全く同じコードになります。
(3)(4) はタイムアウトの処理と、タイムアウトしたかどうかを確認する処理であり、全く同じ条件となります。

自分で考えたこと

(4) でやりたいことが少なければ (3) の位置で処理してしまうパターンがあるかもしれません。(4) で色々やりたいときは、処理待ちのループであることがわかりにくくなるので、ループの外に出す方が汎用的だと思います。

原始的な制御文なので好きなように書いたら良い気もしますが、自身の現場ではこういう書き方にするよう指摘されるなどの情報を頂戴できればと思います。

0

PowerShell に限った話ですか? (そうであろうとは想像してますが)

何の処理をするのか具定例を提示できますか?

0Like

何かの処理が終わるまで待つという事をやりたいのであれば、非同期処理が使えるのではないかと思います。

0Like

@SurferOnWww
ご質問ありがとうございます。

お察しの通り、PowerShellなどシェルスクリプトのような環境を想定しております。

具体的には、command の箇所で AWS EC2インスタンス起動待ち(Get-EC2Instance)やssm automation の完了待ち(Get-SSMAutomationExecution)をしています。

0Like

@radian-jp
ありがとうございます。
おっしゃる通り処理待ちはジョブが使えますね!

ただ、今回は非同期処理を待つケース(質問の情報量が不足しておりました)なので、スクリプトブロックでラップしてもループが必要なのかなと思いました。

0Like

AWS EC2インスタンス起動待ち(Get-EC2Instance)やssm automation の完了待ち

Web サイト/Web API へリクエストを出して、その応答待ちをするというケースなのでしょうか?

PowerShell でも HttpClient を利用できるそうなので、その非同期メソッドを使うという手段もあるようです。

Example using HttpClient in PowerShell
https://gist.github.com/markekraus/a0135d0a5f52b609eda513df4db71cab

0Like

Your answer might help someone💌