2016-01-17 128 views
1

這是一個複雜項目的一部分,我會盡量簡化它。停止第三方功能

我有一個類可以調用並執行它,可調用可以運行任何持續時間。如果我得到的信號(可使用Signal或任何其他標誌我看)終止我要終止當場可調用的執行(但不退出過程中的過程)

class FooRunner(object): 
    def goo(self, foo): 
     try: 
      foo() 
     except: 
      pass 

    def on_stop_signal(self): 
      pass 

回答

1

在單線程信號不在Windows上運行(即任何Unix風格),您可以使用signal.alarm。

檢查第一個例子中的文件 - 它是多還是少,你問什麼: https://docs.python.org/2/library/signal.html

+0

不要我需要的'foo'功能收聽該報警信號? –

+0

不,你自己創建一個處理程序 - 因爲你有一個類,只是創建一個處理程序方法(它應該接受除self之外的兩個位置參數),並且以前調用'foo',將警報處理程序設置爲'self.handler'帶有一個像'signal.signal(signal.SIGALRM,self.handler)'這樣的調用,在它的主體上引發一個特殊的異常,並捕捉到'goo'。 – jsbueno

+1

非常感謝!添加在我使用的測試代碼下面 - 它的功能就像一個魅力。 –

1

一旦有人需要這個這裏是它的代碼示例工作(需要注意的一點signal.signal可只能從主線程)呼籲:

#!/usr/bin/python 
import time 
import signal 
import threading 


class MyException(Exception): 
    pass 


class FooRunner(object): 
    def goo(self, foo): 
     try: 
      signal.signal(signal.SIGALRM, self.on_stop_signal) 
      foo() 
     except MyException: 
      print('caugt alarm exception') 

    def on_stop_signal(self, *args): 
     print('alarm triggered') 
     raise MyException() 


def sample_foo(): 
    time.sleep(30) 


def stop_it(): 
    signal.alarm(3) 
    print('alarm was set for 3 seconds') 


if __name__ == "__main__": 
    print('starting') 
    fr = FooRunner() 
    t = threading.Thread(target=stop_it) 
    t.start() 
    fr.goo(sample_foo) 

感謝@jsbueno