The reason is that if you want to do two things at once, say read from some other network connection, and your SSH session, you have two options: use blocking APIs, and use two threads or processes so you can do them both use non-blocking APIs so the same thread can do both This latter approach is called Asynchronous I/O. See for example twisted which uses it extensively.