停止第三方功能

时间:2016-01-17 03:15:23

标签: python signals

这是一个复杂项目的一部分,我会尝试简化它。

我有一个可调用的类并执行它,可调用的可以运行任何持续时间。如果我收到一个信号(可以使用Signal或我看的任何其他标志)来终止我想在现场终止可调用的执行(当然不退出进程)

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

     def on_stop_signal(self):
            pass

2 个答案:

答案 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