Since we're not checking the value of _current_conns while holding the lock, I think there's a subtle race here:

1. thread-1 goes through _new_if_required(), sees that _current_conns == _max_conns, and doesn't create a new connection
2. In thread-2, _current_conns gets decremented
3. thread-1 hits this check, sees that _current_conns < _max_conns, and sets block to False
4. In thread-2 (or some other thread), _current_conns gets incremented, and the queue is still empty
5. thread-1 doesn't block on trying to get something from the queue, so it fails immediately. It goes through _new_if_required again, but since _current_conns == _max_conns at this point, it doesn't create a connection.
6. NoConnectionAvailable is raised in thread-1 without every having waited for a connection to become available

I'm not sure about what would need to happen for steps 2 and 4 to occur, but it's probably not safe to bet that they won't ever happen.