首页 > 解决方案 > 如何对整个流程从开始到完成进行计时并设置终止执行时间?

问题描述

我有以下芹菜链流程:

@app.task(name='bcakground')
def background_task():    
    
    now = datetime.now() 
       
    ids = [700,701,708,722,783,799]
    for id in ids:
        my_process = chain(taks1.s(id), task2.s())
        my_process()
    
    end = datetime.now()
    return ['ENDED IN',(end-now).total_seconds()] 

Q1:我怎么知道这个任务从开始到结束需要多长时间?我得到的结果(ENDED IN)并不反映事实,因为链是并行运行的,结果只有几分之一秒。

Q2有没有办法在 background_task 的整个过程花费超过 25 分钟的情况下设置终止超时?

标签: pythoncelerybackground-processchain

解决方案


我认为您可以使用 functools 的包装,这里有一个类似问题的答案:timeit-versus-timing-decorator。@jonaprieto 给出了在链接中使用包装的示例,我在下面复制了。这应该可以让你实现你想要的。

from functools import wraps
from time import time

def timing(f):
    @wraps(f)
    def wrap(*args, **kw):
        ts = time()
        result = f(*args, **kw)
        te = time()
        print 'func:%r args:[%r, %r] took: %2.4f sec' % \
          (f.__name__, args, kw, te-ts)
        return result
    return wrap

在一个例子中:

@timing
def f(a):
    for _ in range(a):
        i = 0
    return -1

调用用@timing 包裹的方法 f:

func:'f' args:[(100000000,), {}] took: 14.2240 sec
f(100000000)

推荐阅读