如何从开始到完成对整个过程进行计时并设置终止执行时间?

问题描述

我有以下芹菜链流程:

@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 分钟,有没有办法设置终止超时?

解决方法

我认为您可以使用 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)
,

为此,我使用 timedelta,它返回两个日期时间参数之间的差异。

import datetime

start_at = datetime.datetime.now()

# do your thing!

end = datetime.timedelta(seconds=(datetime.datetime.now() - start_at).total_seconds())

使用此代码,当您 print(end) 时,它会返回类似 0:00:00.253998

的结果