The following post is about a challenge that we encountered at work while extending an in-house-built program that provides automation for 14,000 network devices in our infrastructure. Although we will cover synchronous, asynchronous and threading methods of executing code, the intention of this post is not to go into details of how these methods operate under the hood and rather how they behave in the real world in I/O bound scenarios.