Using Dnspython with Threads
The dnspython Name
and Rdata
types are immutable, and thus thread-safe.
Container objects like Message
, Node
, Rdataset
, RRset
,
and Zone
are not thread-safe, as they are mutable and not locked.
It is up to the caller to ensure safety if they are shared between
threads.
The VersionedZone
, however, is thread-safe. VersionedZones offer
read-only and read-write transactions. Read-only transactions access an
immutable version, and all the objects returned, including containers, are
immutable. Read-write transactions are only visible to their creator until
they are committed. Transaction creation and commit are thread-safe.
Transaction objects should not be shared between threads.
The Resolver
is not thread-safe with regards to configuration, but it is
safe for many threads to call the resolve()
method of a resolver.
The cache implementations for the resolver are also thread-safe, so if a
web-crawling application associates an LRUCache
with a Resolver, it will
be safe to have many crawler threads doing resolutions.
The dns.query
methods are also thread-safe. One caveat with these
functions is that if a socket or other context (e.g. a Requests
session or an SSL context) is passed to the function instead of
allowing the function to create it, then it is up to the application to
ensure thread safety if the context could be used by multiple threads.