go1.20で追加されたCancelとWaitDelayを理解する

なぜこの記事を書くのか?

ただGoでDaggerを使いたかっただけなのだが、daggerを実行しようとするとversion1.20を必要とされた。

その際に以下のようなエラーが出たのでCancelWaitDelayとはなんなのか気になり調べることにした。

...dagger.io/dagger@v0.7.3/internal/engineconn/session.go:152:8: proc.Cancel undefined (type *exec.Cmd has no field or method Cancel)
...dagger.io/dagger@v0.7.3/internal/engineconn/session.go:156:8: proc.WaitDelay undefined (type *exec.Cmd has no field or method WaitDelay)
note: module requires Go 1.20

参考にした記事

Go 1.20で入ったexec.CommandのCancelとWaitDelayで外部コマンドを正しく終了させる - ぽよメモ

Cancelとは

簡単に言うと、他のContextがDoneされた際に呼び出される関数。

exec.CommandContext関数内で呼び出され、デフォルトではprocess killコマンドが呼び出されるようになっている。

Process Killコマンド以外にも自由に設定することができ、以下のようにすればいい。

sampleCtx, sampleCancel := context.WithCancel(ctx)

proc = exec.CommandContext(sampleCtx, xx, yy)

proc.Cancel = 好きなClose処理

WaitDelayとは

上記のCancelが失敗したとされるまでの猶予時間。これを過ぎるとProcess.Killコマンドが実行される。

Dagger sessionでは5分が設定されていた。

proc.WaitDelay = 300 * time.Second