微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有以下芹菜链流程:

@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

的结果

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。