want to use threading.RLock() since if one function calls another in the same thread that tries to acquire that lock, you want that to succeed. I assumed threading.lock was already a recursive lock - it isn't. (jang)
Renaming ThreadLock to XMLParserLock as that's the only place we're using it. Also, try to catch all Server instances of the lxml.etree.parser