Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 停止第三方功能_Python_Signals - Fatal编程技术网

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)