正在运行时执行命令的时间

时间:2018-01-11 07:48:55

标签: python python-2.7 time xspec

我有一个命令(Fit.perform()来自import xspec,但没关系因为问题是一般的,也可以应用于其他python命令)需要一段时间才能完成。

我很想知道在命令运行时执行的时间,所以当尚未完成执行时。 如果我想在执行期间停止命令,这是必要的,例如因为它花费了太多时间来结束。

所以,我需要这样的东西:

if **you_are_taking_so_much_time**:
    do_something_else

不可能使用timetimeit之类的方法,因为它们只在命令执行结束时而不是在运行时计算时间。

有可能吗?

我在MacOS上使用python 2.7。

2 个答案:

答案 0 :(得分:1)

您必须使用监视器线程:

import threading
import time

done = False

def longfun():
    global done
    print("This will take some time.")
    time.sleep(60)
    done = True

def monitor():
    global done
    timeout = 10
    print("Wait until timeout.")
    while not done and timeout > 0:
        time.sleep(1)
        timeout -= 1

lt = threading.Thread(target=longfun)
lt.start()
mt = threading.Thread(target=monitor)
mt.start()

mt.join()
if done == False:
    print("Long thread not done yet. Do something else.")

lt.join()

请注意,这会等到'long'线程结束。你没有提到你想要停止长时间运行的操作。如果这样做,则必须在线程中正确实现它,包括启动/停止/进度功能(通常这适用于使用while位的running循环,以查看它是否应该继续。

答案 1 :(得分:0)

像这样:

import time,thread
def test_me(hargs):
    func,args,timeout = hargs
    start_time = time.time()
    thread.start_newthread(func,args)
    while True :
        if My_expected_value:#where store this ?
            print "well done !"
            break
        elif time.time() > (timeout + start_time) :
            print "oh! to late, sorry !"
            break
        time.sleep(timeout/100)
thread.start_newthread(test_me,((func,args,timeout),))

重要警告:需要使用线程进行非冻结应用,获得3个线程:1-main app,2-test_me,3-你的函数(func)

不要忘记在函数中添加外部变量(用于终止函数线程)