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



我有以下芹菜链过程:

@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与timing decorator@jonapreto给出了一个在链接中使用包装的例子,我在下面复制了它。这应该能让你实现你想要的。

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的结果

最新更新