LoginSignup
11
2

【小ネタ】50以上の実行を同時に行いたい

Posted at

はじめに

Power Automate には複数の要素にそれぞれアクションを行うApply to each(それぞれに適応する)というコントロール操作があります。
image.png

この複数の要素に対するアクションで、待機を含むアクションや時間のかかるアクションがある場合、1つ目のループが終わらないと、次のループに入らないという問題があります。

例えば、このような、メンバー全員にアンケートを取るようなフローでは、1人の回答が滞ると、以降のメンバーには質問が届かないという問題があります。
image.png

これを避けるため、多重実行の設定、コンカレンシー制御という設定があります。
この設定をオンにすることで多重実行ができるので、複数のメンバーにも同時にアンケートを取ることができるようになります。
image.png

ただし、この設定の最大値は50までですので、それより多い人数への多重実行はできません。

この記事はその制限を無理やり超えようというものです。

まずは普通にフローを作成

最初は普通にフローを作成します。
image.png

50以上の配列を作成するために、range関数で1~150の連番を作成しています。
image.png

もちろんコンカレンシー制御はオンで50まで目いっぱい広げています。
image.png

この状態で実行してみる

実行すると、待機時間を1時間持たせているため、次の実行はループには移りません。
image.png

結果をExcel のテーブルに記録しているのですが、確認すると50までしか
記録されていないのがわかります。
想定通りの結果ですね。
image.png

ちなみに、テーブルの番号がバラバラなのはコンカレンシー制御が実行順序を保証しないからです。
順序が必要な場合には、コンカレンシー制御の使用は難しいので注意です。

配列を小分けにする

50までしか同時に実行できないのであれば、50ずつに分割してあげましょう。
ということで、作成アクションにchunk関数で、配列を分割する処理を追加します。
image.png

image.png

この関数は、配列に使用した場合、指定した要素数で分割することができます。

実行すると、このように指定した数、50ずつの配列に分割されることがわかります。
image.png

さらにApply to each で囲む(ダメパターン)

さて、分割できたら多重の多重実行になるように、もとからあったApply to each をさらにApply to eachで囲んであげます。
image.png

どちらのApply to each も並列処理の時数を50に設定しています。
これで50×50=2500の並列処理が叶うはず…。

実行してみた結果がこちら!
image.png

・・・あれ?
どうやら入れ子になったApply to each では、外側のループでしか並列処理が実行されないようです。

子フローに分ける

入れ子ではできなかったので、子フローに分けて疑似的に入れ後を解消します。
image.png

子フローのInputには配列やオブジェクトの型指定がなさそうでしたので、string関数でJOSN文字列に変換して子フローに送ります。
image.png

子フロー側では、受け取ったJSON文字列をjson関数で配列に戻してあげます。
image.png

動作確認

実行すると、瞬時に150の項目が入力されました!
image.png

親フローでは3件(150÷50=3)の子フローが同時に実行されており。
image.png
image.png

子フローは、各50件の実行が並列起動して待機状態になっていました。
image.png
これで応答を待つ50件以上の実行を同時に行うことができそうです。

おわりに

Apply to each の入れ子で並列処理ができないのは意外でした。

同時実行数をあまりにも多くすると、接続先のサービスに対して大きな負荷をかけることになります。
受け入れ先APIの仕様で短期間に受け付ける要求数を制限されることはよくありますので、使用するサービスの仕様とよく相談の上ご使用ください。

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2