В Python socket.getaddrinfo использует кеш? - PullRequest
0 голосов
/ 13 марта 2020

Мое приложение выполняет много RPC. И получил некоторые ошибки разрешения DNS. Я обнаружил, что торнадо AsyncHttpClient не кэширует результаты DNS, и каждый раз вызывает socket.getaddrinfo.

Я нашел библиотеки, такие как https://github.com/jayvdb/dns-cache

и фрагменты, такие как

def _setDNSCache():
    """
    Makes a cached version of socket._getaddrinfo to avoid subsequent DNS requests.
    """

    def _getaddrinfo(*args, **kwargs):
        if args in kb.cache:
            return kb.cache[args]

        else:
            kb.cache[args] = socket._getaddrinfo(*args, **kwargs)
            return kb.cache[args]

    if not hasattr(socket, "_getaddrinfo"):
        socket._getaddrinfo = socket.getaddrinfo
        socket.getaddrinfo = _getaddrinfo

Стоит ли использовать библиотеку DNS-кэша прикладного уровня?

1 Ответ

0 голосов
/ 20 марта 2020

Python не имеет собственного кеша DNS; он будет звонить getaddrinfo каждый раз. Кэшируется ли этот вызов getaddrinfo операционной системой, зависит от ряда факторов. В прошлый раз, когда я смотрел на это, это обычно не было по умолчанию, но это были годы go. Установка dnsmasq - это (или был) самый простой способ получить системный кэш DNS (который понимает и соблюдает TTL и т. Д. c)

...