超时功能,如果它需要太长时间

时间:2016-05-24 11:26:52

标签: python python-2.7 function

原谅我,我是新手。我调查了一些解决方案。但是我很难理解并修改它。 (或者也许没有符合我想象的解决方案?)。我希望它可以在Ubuntu& Win7的。

有一个这样的例子。

public function beforeSave($options = array()) {

    if($this->id) {
        // Update
    } else {
        // Add
    }
}

我的想象力是......

如果示例()运行超过10秒,则再次重新运行示例()。 (也许有一个地方我可以编写其他任何东西。就像我想在TXT上记录超时事件,我可以在那个地方编写代码。) 否则,什么都不做。

有可能吗?

2 个答案:

答案 0 :(得分:2)

你可以在一个单独的线程中运行一个看门狗,当它超过时间限制时,它会中断主线程(运行example)。这是一种可能的实现,超时降低到3s以便于调试:

import time, threading, thread

def watchdog_timer(state):
    time.sleep(3)
    if not state['completed']:
        thread.interrupt_main()

def run_example():
    while True:
        state = {'completed': False}
        watchdog = threading.Thread(target=watchdog_timer, args=(state,))
        watchdog.daemon = True
        watchdog.start()
        try:
            example()
            state['completed'] = True
        except KeyboardInterrupt:
            # this would be the place to log the timeout event
            pass
        else:
            break

答案 1 :(得分:0)

我不确定我是否完全理解你想要实现的目标,但是由于你经常循环并且只有一个简短且可预测的阻塞命令,你可以简单地存储循环开始的时间,然后将它与每循环迭代一次的当前时间。如果差异超出了您的限制,请执行任何操作:

import random,time
time_limit=10

def example():
    time_start = time.time()  # store current time (seconds since 1970)
    while random.randint(0,10) != 1:
        time.sleep(1)
        if (time.time() >= time_start + time_limit):  # compare with current time
            print "canceled!"
            break  # break the while-loop
    print "down"

example()