超时不受控制的Python中的重写函数

时间:2017-01-19 16:43:58

标签: python

有一些问题在讨论这个问题,但没有一个问题我有这样的约束,所以也许有人会有个好主意。

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

  1. 跨平台(即无信号.ALARM)

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

  3. 只有该功能需要超时,才能退出整个程序。

  4. 我完全无法控制被调用的函数,即它使用抽象接口(使用派生类和覆盖)进行回调。其他人将编写这些回调函数,并假设他们是白痴。

  5. 示例代码:

    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()
    

    任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

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

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

但是,我想出了下面显示的一种可能性(仅在python3中测试过,但是应该在python2中稍作修改)。

  

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

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()