Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Timer_Signals - Fatal编程技术网

Python 在一定时间后使函数超时

Python 在一定时间后使函数超时,python,multithreading,timer,signals,Python,Multithreading,Timer,Signals,我有一个长时间运行的线程,它调用一个方法。我想为一个超过一定时间的方法实现一个超时,然后退出该方法,但不退出线程 注意:我的用例是(Objective),我有一个线程,它不断地从实时数据流中轮询,并用某种方法处理它(对于某些数据点可能会花费无限的时间)。所以我想让方法超时,而不是线程超时,这样我就可以继续轮询实时数据 下面是我试图修复的示例代码。当我们启动一个线程并创建一个异常时,它就工作了,但是有一个以上的线程信号不工作 from threading import Thread import

我有一个长时间运行的线程,它调用一个方法。我想为一个超过一定时间的方法实现一个超时,然后退出该方法,但不退出线程

注意:我的用例是(Objective),我有一个线程,它不断地从实时数据流中轮询,并用某种方法处理它(对于某些数据点可能会花费无限的时间)。所以我想让方法超时,而不是线程超时,这样我就可以继续轮询实时数据

下面是我试图修复的示例代码。当我们启动一个线程并创建一个异常时,它就工作了,但是有一个以上的线程信号不工作

from threading import Thread
import time
import signal

def random_func(a):
    time.sleep(a)
    return True


class TimeoutException(Exception):   # Custom exception class
    pass

def timeout_handler(signum, frame):   # Custom signal handler
    raise TimeoutException

signal.signal(signal.SIGALRM, timeout_handler)
class CheckThreadSignal(Thread):
    def __init__(self, thread_id):
        self.thread_id = thread_id
        super().__init__()
    def run(self):
        c = 0
        while True:
            signal.alarm(5)
            try:
                if self.thread_id == 2 and c == 10:
                    random_func(10)
                else:
                    random_func(0.1)
            except TimeoutException:
                print("signal: {}".format(self.thread_id), e)
                continue
            else:
                signal.alarm(0)
                print("running: {}, count: {}".format(self.thread_id, c))
                time.sleep(0.1)
                c+=1
                
CheckThreadSignal(0).start()
CheckThreadSignal(2).start()

这回答了你的问题吗@mkrieger1否,因为该方法未在线程内调用。我没有写过try,除了在方法中。