While the OP talks specifically about Python, the patterns of a semaphore, lock (aka mutex, a semaphore with value 1), condition and queue are relevant to many languages, many of which are not hampered by a GIL. Personally, the more I use threads, the more I like this way of programming, at least for the request/response paradigm.