这是一个复杂项目的一部分,我会尝试简化它。
我有一个可调用的类并执行它,可调用的可以运行任何持续时间。如果我收到一个信号(可以使用Signal或我看的任何其他标志)来终止我想在现场终止可调用的执行(当然不退出进程)
class FooRunner(object):
def goo(self, foo):
try:
foo()
except:
pass
def on_stop_signal(self):
pass
答案 0 :(得分:1)
在没有在Windows上运行的单线程信号(即任何Unix风格)上,你可以使用signal.alarm。
检查文档中的第一个示例 - 它或多或少是您要求的: https://docs.python.org/2/library/signal.html
答案 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