使用超时ctypes调用C函数

2024-10-03 23:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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函数。这是我的密码。在

^{pr2}$

这段代码也不起作用:当我调用iw_solve_wtimeout(10)时,函数在10秒后不会停止。在

你对使用ctypes做这件事有什么想法吗?在

非常感谢你的帮助。在

马克


Tags: the项目函数代码none密码whichtime
1条回答
网友
1楼 · 发布于 2024-10-03 23:21:23

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

即使它能工作,停止线程也是错误的。你应该把穿线看作是一种合作的努力。如果你想让一个线程停止,那么你需要让它停止,然后等待它停止。使用合作而不是武力来避免各种可怕的问题。在

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

但基本上你需要在你的C代码中提供一个显式的取消机制。在

相关问题 更多 >