2013-01-16 52 views

回答

3

有沒有什麼在pyunit本身,但作爲一個工作可以推出自己的。以下是使用多處理程序包的方法。

from functools import wraps 
from multiprocessing import Process 

class TimeoutError(Exception): 
    pass 

def timeout(seconds=5, error_message="Timeout"): 
    def decorator(func): 
     def wrapper(*args, **kwargs): 
      process = Process(None, func, None, args, kwargs) 
      process.start() 
      process.join(seconds) 
      if process.is_alive(): 
       process.terminate() 
       raise TimeoutError(error_message) 

     return wraps(func)(wrapper) 
    return decorator 

下面是如何使用它的一個例子:

import time 

@timeout() 
def test_timeout(a, b, c): 
    time.sleep(1) 

@timeout(1) 
def test_timeout2(): 
    time.sleep(2) 

if __name__ == '__main__': 
    test_timeout(1, 2, 3) 

    test_value = False 
    try: 
     test_timeout2() 
    except TimeoutError as e: 
     test_value = True 

    assert test_value 
+0

感謝您的答覆!我無法讓示例運行。我得到一個錯誤 - TypeError:'NoneType'對象不可調用。這出現在兩個裝飾線上。目前我擁有同一個文件中的所有內容。 – Murkantilism

+0

我更新了它,現在它應該可以在Linux上運行。稍後我會看看我能否在Windows上工作。 – Joe

+0

酷,一個Windows解決方案將不勝感激! – Murkantilism