使用超时调用C函数 - ctypes

时间:2011-03-09 14:41:11

标签: python ctypes

我在python项目中使用ctypes,我需要调用一些C函数,这些函数可能需要几个小时才能给出响应。我的问题是我想在一定时间后杀死函数(来自python代码),即使函数还没有完成计算。

我尝试使用多线程但它并没有停止C函数。这是我的代码。

lib_iw = cdll.LoadLibrary("./iw.so")

iw_solve = lib_iw.solve_iw # the C function which can take some hours for responding
iw_solve.restype = c_void_p
iw_solve.argtypes = [c_void_p]

def iw_solve2() :
    iw_solve(None)

def iw_solve_wtimeout(time_out) : # the function which thow $iw_solve and kill the execution of $iw_solver after $time_out seconds (but it doesn't work)
    t_solve = threading.Thread(None,iw_solve2,None,(),None)
    t_solve.run()
    t = time.time()

    while(t_solve.is_alive() and ((time.time() - t) < 2)) :
        time.wait(0.3)

    if(t_solve.is_alive()) :
        t_solve._Thread__stop()
        print "iw_solve was killed"
    else :
        print "iw_solve has respond"

它不起作用:当我调用iw_solve_wtimeout(10)时;该功能在10秒后不会停止。

我尝试了闹钟,但它没有停止c功能。这是我的代码。

lib_iw = cdll.LoadLibrary("./iw.so")

iw_solve = lib_iw.solve_iw # the C function which can take some hours for responding
iw_solve.restype = c_void_p
iw_solve.argtypes = [c_void_p]

def iw_solve_withtimeout(time_out) : # the function which thow $iw_solve and kill the execution of $iw_solver after $time_out seconds (but it doesn't work)
    signal.signal(signal.SIGALRM, handler)
    signal.alarm(time_out)
    try :
        print "debut iw_solve"
        signal.alarm(time_out)
        iw_solve(None)
    except Exception, exc:
        print exc
        return None;

此代码也不起作用:当我调用iw_solve_wtimeout(10)时;该功能在10秒后不会停止。

你有使用ctypes做一些想法吗?

非常感谢你的帮助。

马克

1 个答案:

答案 0 :(得分:0)

这是行不通的,因为Python代码无法看到C代码来阻止它运行。这种方法只适用于纯Python代码。

即使它会起作用,停止线程也是错误的方法。您应该将线程视为一种合作努力。如果你想要一个线程停止,那么你需要让它停止,然后等到它完成了。使用合作而不是强制可以避免各种可怕的问题。

您需要做的是修改您的C代码并允许它被发出信号取消。 C代码需要定期检查此信号。您可以使用ctypes回调或其他许多方式来实现它。

但从根本上说,您需要在C代码中提供明确的取消机制。