我有一个命令(Fit.perform()
来自import xspec
,但没关系因为问题是一般的,也可以应用于其他python命令)需要一段时间才能完成。
我很想知道在命令运行时执行的时间,所以当尚未完成执行时。 如果我想在执行期间停止命令,这是必要的,例如因为它花费了太多时间来结束。
所以,我需要这样的东西:
if **you_are_taking_so_much_time**:
do_something_else
不可能使用time
或timeit
之类的方法,因为它们只在命令执行结束时而不是在运行时计算时间。
有可能吗?
我在MacOS上使用python 2.7。
答案 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)
不要忘记在函数中添加外部变量(用于终止函数线程)