Generally speaking, dnspython is not designed to be thread-safe, but it does provide thread-safe classes for cases where you're likely to want concurrency.
Names and rdata are immutable, and so safe to share between threads.
Container classes like rdatasets, rrsets, messages, and Zone (but not VersionedZone) are NOT thread-safe, and any concurrency must be managed by the application.
The resolver is also not thread-safe in terms of its configuration, but multiple threads can call a resolver's resolve() method as resolutions do not mutate the state of the resolver other than updating the cache (if one is in use). The resolver cache implementations ARE thread-safe. So basically you can do web-crawling and other things
concurrently.
The VersionedZone object is also thread-safe. It can only be altered by transactions, transactions are locked, and committed data are immutable.