Python中的超时非受控重写函数

Python中的超时非受控重写函数,python,Python,有一些问题在讨论这一点,但没有一个有我所拥有的一套约束,所以也许有人会提出一个好主意 基本上,我需要在以下约束条件下为Python函数设置超时: 跨平台(即无信号报警) 不是Python 3(我可以假设Python>=2.7.9) 只有功能需要超时,不能只退出整个程序 我完全无法控制被调用的函数,也就是说,它是一个使用抽象接口(使用派生类和重写)的回调。其他人将编写这些回调函数,他们的假设是它们是白痴 示例代码: class AbstractInterface(Object): def

有一些问题在讨论这一点,但没有一个有我所拥有的一套约束,所以也许有人会提出一个好主意

基本上,我需要在以下约束条件下为Python函数设置超时:

  • 跨平台(即无信号报警)

  • 不是Python 3(我可以假设Python>=2.7.9)

  • 只有功能需要超时,不能只退出整个程序

  • 我完全无法控制被调用的函数,也就是说,它是一个使用抽象接口(使用派生类和重写)的回调。其他人将编写这些回调函数,他们的假设是它们是白痴

  • 示例代码:

    class AbstractInterface(Object):
        def Callback(self):
            # This will be overridden by derived classes.
            # Assume the implementation cannot be controlled or modified.
            pass
    
    ...
    
    def RunCallbacks(listofcallbacks):
        # This is function I can control and modify
        for cb in listofcallbacks:
            # The following call should not be allowed to execute
            # for more than X seconds. If it does, the callback should
            # be terminated but not the entire iteration
            cb.Callback()
    
    任何想法都将不胜感激

    其他人将编写这些回调函数,他们的假设是它们是白痴

    你真的不应该从你认为“白痴”的人那里执行代码。

    然而,我提出了如下所示的一种可能性(仅在python3中测试,但应在python2中进行少量修改)

    警告:这将运行新进程中的每个回调,该进程在指定的超时后终止


    >你真的不应该从你认为“白痴”的人身上执行代码。这是不可能的,我正在编写一个框架,为其他人提供一个API。这就像是用插件平台编写软件——你不知道谁会编写插件,所以你不能假设他们知道如何编写代码。无论如何,我考虑过分叉,主要问题(除了进程创建开销和POSIX/Windows差异)是需要使用复杂的IPC(我忘了在代码中提到使用“self”指针)。
    from multiprocessing import Process
    import time
    
    def callback(i):
        while True:
            print("I'm process {}.".format(i))
            time.sleep(1)
    
    if __name__ == '__main__':
        for i in range(1, 11):
            p = Process(target=callback, args=(i,))
            p.start()
            time.sleep(2) # Timeout
            p.terminate()