【问题标题】:Retries in dask.compute() are uncleardask.compute() 中的重试尚不清楚
【发布时间】:2020-01-25 15:47:38
【问题描述】:

来自文档,Number of allowed automatic retries if computing a result fails.

“结果”是指每个单独的任务还是整个 compute() 调用?

如果是指整个调用,dask.delayed中的每个任务如何实现重试?

另外,我不确定重试是否有效,如下面的代码所示。

import dask
import random

@dask.delayed
def add(x, y):
    return x + y

@dask.delayed
def divide(sum_i):
    n = random.randint(0, 1)
    result = sum_i / n
    return result

tasks = []
for i in range(3):
    sum_i = add(i, i+1)
    divide_n = divide(sum_i)
    tasks.append(divide_n)

dask.compute(*tasks, retries=1000)

预期输出为 (1, 3, 5),实际为 ZeroDivisionError。

【问题讨论】:

    标签: dask dask-delayed


    【解决方案1】:

    如果有人感兴趣,我们可以使用@retry 装饰器来处理任务,如下所示:

    @dask.delayed
    @retry(Exception, tries=3, delay=5)
    def my_func():
        pass
    

    重试装饰器:

    from functools import wraps
    
    def retry(exceptions, tries=4, delay=3, backoff=2, logger=None):
        """
        Retry calling the decorated function using an exponential backoff.
    
        Args:
            exceptions: The exception to check. may be a tuple of
                exceptions to check.
            tries: Number of times to try (not retry) before giving up.
            delay: Initial delay between retries in seconds.
            backoff: Backoff multiplier (e.g. value of 2 will double the delay
                each retry).
            logger: Logger to use.
    
        """
        if not logger:
            logger = logging.getLogger(__name__)
    
        def deco_retry(f):
            @wraps(f)
            def f_retry(*args, **kwargs):
                mtries, mdelay = tries, delay
                while mtries > 1:
                    try:
                        return f(*args, **kwargs)
                    except exceptions as e:
                        msg = f"{e}, \nRetrying in {mdelay} seconds..."
                        logger.warning(msg)
                        sleep(mdelay)
                        mtries -= 1
                        mdelay *= backoff
                return f(*args, **kwargs)
            return f_retry  # true decorator
    
        return deco_retry
    

    【讨论】:

    • 澄清一下,这在 Dasks 内部重试机制之前通过在异常到达工作人员之前捕获异常?
    • 我不知道 Dask 有什么重试(它们从未为我们工作过),但这是在任务内部发生的,所以是的,这将在 Dask 知道有任何异常之前执行。跨度>
    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多