はじめに
これはno plan inc.の Advent Calendar 2022の15日目の記事です。
cloud run jobsではタスク1つあたりの実行時間の上限が1時間になっており、これを超えるような処理を行うにはタスクを分割する必要がある。
ここでは例として1000万以下の素数を求めるプログラムを100分割して5個並列に処理する。
目次
ジョブで利用できる環境変数
cloud run jobでは以下の環境変数が利用できる。
名前 | 説明 | 例 |
---|---|---|
CLOUD_RUN_JOB | 実行されている Cloud Run ジョブの名前。 | hello-world |
CLOUD_RUN_EXECUTION | 実行されている Cloud Run 実行の名前。 | hello-world-abc |
CLOUD_RUN_TASK_INDEX | タスクごとに、0 から「タスク数 - 1」までの一意の値が設定されます。 | 0 |
CLOUD_RUN_TASK_ATTEMPT | このタスクが再試行された回数。最初の試行は 0 から始まり、再試行の最大回数まで、続けて再試行するたびに 1 ずつ増加します。 | 0 |
CLOUD_RUN_TASK_COUNT | --tasks パラメータで定義されたタスクの数。 | 1 |
今回はCLOUD_RUN_TASK_INDEXとCLOUD_RUN_TASK_COUNTを利用する。
ジョブの設定
コード
以下のコードをデプロイし実行すると1000万以下の素数を表示する。
example.ts
export class PrimeNumber {
main(): void {
//jobの環境変数
const taskIndex = Number(process.env.CLOUD_RUN_TASK_INDEX);
const taskCount = Number(process.env.CLOUD_RUN_TASK_COUNT);
//タスク1つ当たりの素数を求める範囲
const numPerTask = 10000000 / taskCount;
//そのタスクでstartNum以上、endNum以下の素数を求める
let startNum = numPerTask * taskIndex + 1;
const endNum = numPerTask * (taskIndex + 1);
//素数を求めるロジック
for (; startNum <= endNum; startNum++) {
let divisor = 0;
for (let i = 1; i <= startNum; i++) {
if (startNum % i == 0) divisor++;
}
if (divisor == 2) console.log(startNum);
}
}
}
const primeNumber = new PrimeNumber();
primeNumber.main();