Great explanation...
For anyone interested, the following jupyter notebook explains three different ways to process HTTP requests: serial requests (the baseline), pipelined requests and parallel requests with multiple connections (and without threads).
https://gist.github.com/coady/f9e1be438ba8551dabad