2013-03-30 88 views
2

我有可能有無限循環的代碼。我希望能夠在代碼中阻止它,有沒有什麼可以做到的?有些東西,如:Python,預測無限循環

for i to range(0,5): 
    timer = on 
    run(x) 
    #while run is running 
    if timer.time > 30: 
     exit run(x) 
     print("out of time ") 
    print(timer.time) 

所以輸出可能是:3,2,出來的時候30,2,出來的時候30

恐怕這可能需要線程,這是我在嘗試C和Java,學校,但從來沒有蟒蛇。

+0

你的意思是像[破](http://docs.python.org/2/tutorial/controlflow.html#break-and - 繼續語句,和其他子句-ON-循環)? – Mariano

+0

不,因爲我不想跳出for循環,只是迭代運行(x) – EasilyBaffled

+0

@ F3AR3DLEGEND:它顯然是僞代碼。 – nneonneo

回答

3

有幾個選項:

  1. 如果你可以修改run的‘永無止境’的循環,使檢查的時間。這可能是最簡單的。
  2. 如果在Linux/UNIX上,可以使用signal.alarmSIGALRM處理程序在一段固定時間後中斷。
  3. 當時間流逝時,你可以產生一個單獨的線程和kill the other thread。這非常討厭,只能在Windows上使用(或關心可移植性),並且無法修改run
  4. 您可以將run產生到單獨的進程中,並在時間到期時終止進程(例如,使用multiprocessing)。

這裏的中斷使用signal.alarm計算的例子:

import signal 

class TimeoutException(Exception): 
    pass 

def alarm_handler(*args): 
    raise TimeoutException() 

def tryrun(func, timeout=30): 
    oldhandler = signal.signal(signal.SIGALRM, alarm_handler) 
    try: 
     signal.alarm(timeout) 
     func() 
    except TimeoutException: 
     print "Timeout" 
    else: 
     print "Success" 
    finally: 
     signal.alarm(0) # disarm alarm 
     signal.signal(signal.SIGALRM, oldhandler) 

import time 
tryrun(lambda: time.sleep(10), 5) # prints Timeout 
tryrun(lambda: time.sleep(2), 5) # prints Success 
+0

我正在一個mac上工作,所以我想象signal.alarm可能會工作,但我從來沒有見過。你能給我一個pdedecode的例子嗎?這是你談論的事情嗎? http://pguides.net/python-tutorial/python-timeout-a-function/ – EasilyBaffled

+0

@EasilyBaffled:添加。 – nneonneo

+0

@EasyilyBaffled:是的,基本上就是這樣。我發佈的代碼非常相似,只不過它重置了'try'中的警報以避免競爭狀況。 – nneonneo