2016-05-24 5 views
0

Простите меня, я новичок. Я рассмотрел какое-то решение. Но мне так трудно понять и изменить это. (Или, может быть, нет решения в соответствии с моим воображением?). И я надеюсь, что он может работать на Ubuntu & Win7.Функция таймаута, если требуется слишком много времени

Существует такой пример.

import random,time 

def example(): 
    while random.randint(0,10) != 1: 
     time.sleep(1) 
    print "down" 

example() 

И мое воображение ...

Если пример() пробегают 10с, а затем повторно запустить пример снова(). (И, возможно, есть место, где я могу закодировать что-нибудь еще. Например, я хочу записать событие тайм-аута в TXT, и я могу закодировать код в этом месте.) Иначе ничего не делать.

Возможно ли это?

ответ

1

Вы можете запустить сторожевую собаку в отдельном потоке, который прерывает основной поток (который работает example), когда она превышает лимит времени. Вот возможная реализация, с тайм-аут понижен до 3 секунд для облегчения отладки:

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 
+0

Благодарим за помощь. Это то, что я хочу. – h8a2n5k23

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() 
+0

ОП, вероятно, означает соблюдение тайм-аут * без изменения * 'example', что он, возможно, не контролирует. – user4815162342

+0

спасибо. @ user4815162342 прав.^_^ – h8a2n5k23

Смежные вопросы