アルパカ三銃士

〜アルパカに酔いしれる獣たちへ捧げる〜

Go Conference 2018 Spring へ登壇しました

Goroutine meets a signal というタイトルで登壇しました。

これは Golet という Perl でいう Proclet を Go に移植した際に閃いたアイディアでした。

親プロセスである Proclet へ SIGTERM, SIGHUP が送信された場合に、Proclet で管理している子プロセスへ SIGTERM を送信するといった挙動を持っていました。SIGTERM は処理を終了させるために用いられますが、プログラムによってはシグナルを受け取った時の挙動を上書きされている場合があるため実質、シグナルの情報を子プロセスへ送信することになると僕個人で解釈してました。

そのため、Go に移植する場合は goroutine で管理するようにし、主プロセスである Golet へシグナルが送られてきた場合、その情報を全ての goroutine へ通知することを目標としました。

そして Golet ではコールバックを指定することが可能なんですが、context.Context は必ず必須であり、それ以外にも golet 専用の Context も引数として渡さなければいけない状況でした。これだとどっちが一番大事な Context なのか分からなくなります。

そのため今回発表したような形をとることで、Context を単一化することに成功し、Go らしくシンプルに記述することが可能になりました。

この手法は本当に時と場合によると思いますので、様々な Go ハッカー達が議論するきっかけになればいいなと思います。