【问题标题】:Python dns timeout while running in Celery but not while running in Interactive shell在 Celery 中运行时 Python dns 超时,但在交互式 shell 中运行时没有
【发布时间】:2020-12-16 05:21:16
【问题描述】:

有一点好笑,我有如下外部函数。

def get_A_records(domain, default="A"):
    """
    Get the A Records of a domain
    """
    try:
        resolver  = Resolver()
        a_record = resolver.query(domain, default)
        a_records = list()
        
        for r in a_record:
            a_dict = dict()

            a_dict["domain"]=domain
            a_dict["a_ip"]=r.address
            a_dict["rtype"]=default
            a_records.append(a_dict)
            
        return a_records
            
    except Exception as e:
        print(e)
        return {}

当我导入这个函数并在交互式 shell 中运行它时,不到一秒

该函数旨在用于芹菜。但是当我在 celery 中调用函数时

@app.task
def update_domain(domain):
    try:
       ips_v4 = get_A_records(domain)
    except Exception as e:
       print("Failure... recorded!")

我收到以下错误

为什么会这样?什么是替代方案?谢谢!

【问题讨论】:

标签: python dns celery


【解决方案1】:

我终于找到了一个可行的解决方案。以防有人遇到同样的问题。

使用 dnspython 支持的异步 dns 模块。

from dns import asyncresolver
import dns

async def async_get_A_records(domain, default):
        """
        Asyncrhonous
        """
        a_record = await asyncresolver.resolve(domain, default)
        a_records = list()

        for r in a_record:

            a_dict = dict()

            a_dict["domain"]=domain
            a_dict["a_ip"]=r.address
            a_dict["rtype"]=default
            a_records.append(a_dict)
    
       return a_records

现在在 celery app.task 中

async def query_domain_a(domain):
    result = await async_get_A_records(domain)
    print(result)

@app.task
def update_domain(domain):
    try:
       asyncio.run(query_domain_a(domain, "A"))
       asyncio.run(query_domain_a(domain, "AAAA"))
    except Domain.DoesNotExist as E:
        print(E)
    except Exception as e:
        print(e)

而且您不会看到超时。 小心。 celery 文档真的不鼓励使用 asyncio 或运行非异步任务。

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多