Python 停止第三方功能
这是一个复杂项目的一部分,我将尝试简化它 我有一个类,它获取一个可调用函数并执行它,可调用函数可以在任何时间段内运行。如果我得到一个终止信号(可以使用或任何其他我看到的标志),我想当场终止可调用的执行(当然不退出进程)Python 停止第三方功能,python,signals,Python,Signals,这是一个复杂项目的一部分,我将尝试简化它 我有一个类,它获取一个可调用函数并执行它,可调用函数可以在任何时间段内运行。如果我得到一个终止信号(可以使用或任何其他我看到的标志),我想当场终止可调用的执行(当然不退出进程) 对于不在Windows上运行的单线程信号(即任何Unix版本),您可以使用signal.alarm 查看文档中的第一个示例-这或多或少是您想要的: 如果有人需要它,这里有一个它工作的代码示例(需要注意的是signal.signal只能从主线程调用): 谢谢@jsbueno我不需要
对于不在Windows上运行的单线程信号(即任何Unix版本),您可以使用signal.alarm 查看文档中的第一个示例-这或多或少是您想要的:
如果有人需要它,这里有一个它工作的代码示例(需要注意的是
signal.signal
只能从主线程调用):
谢谢@jsbueno我不需要
foo
函数来监听报警信号吗?不-你自己创建一个报警处理程序-因为你有一个类,只需创建一个处理程序方法(除了self
之外,它还应该接受两个位置参数),然后调用foo
,将报警处理程序设置为self.handler
,调用类似于signal.signal(signal.SIGALRM,self.handler)
-在其主体上,引发您在goo
上捕获的特定异常。非常感谢!添加在我使用的测试代码下面-它像一个符咒一样工作。
class FooRunner(object):
def goo(self, foo):
try:
foo()
except:
pass
def on_stop_signal(self):
pass
#!/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)