A cleaner way to shutdown a Golang application

One of Golang’s main features is the ability to be able to run multiple tasks in concurrency. It is a programming language widely used for its versatility, fast execution, and ease to use.

It can be used to develop web servers or other long-running tasks. In those cases, it is important to be able to gracefully shut down the application, especially when dealing with some state information. Cleaning up the used resources if necessary and smoothly terminating its concurrent processes.

The concept of a graceful shutdown is usually used in the context of Operational Systems. The opposite would be a forced shutdown, where the system goes off without the opportunity of performing the tasks it was supposed to before shutting down.

Fortunately, Golang provides tools that allow us to listen to shutdown requests and handle them accordingly.

Handling cancel signals with Golang Contexts

While running multiple GO routines, we need to provide a coordinated way for them to exit smoothly. This can be achieved through the Context package. According to its documentation:

Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes.(context package docs)