有一些问题在讨论这个问题,但没有一个问题我有这样的约束,所以也许有人会有个好主意。
基本上我需要在以下约束条件下为Python函数设置超时:
跨平台(即无信号.ALARM)
不是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()
任何想法都将不胜感激。
答案 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()