use*_*783 11 python sandbox infinite-loop python-embedding
如果我将Python解释器嵌入到C或C++程序中,如本例所示,有没有办法限制解释器运行的时间?有没有什么可以阻止Python代码进入无限循环,从而阻止PyObject_CallObject(或等效)返回?
类似地,如果Python代码创建了一个新线程,那么有什么东西可以阻止这个线程进入无限循环并永远运行吗?
正如您在文档中看到的那样,PyObject_CallObject没有限制函数运行时间的机制.我也知道没有Python C API函数允许您暂停或终止解释器使用的线程.
因此,我们必须在如何阻止线程运行方面更具创造性.我可以想到你可以做到的3种方法(从最安全/最干净到最危险......
这里的想法是你的Python函数可以运行很长时间只是调用主应用程序中的另一个函数,使用C API来查看它是否应该关闭.一个简单的True/False结果将允许您优雅地终止.
这是最安全的解决方案,但要求您更改Python代码.
由于您正在嵌入Interpreter,因此您已经在使用C API,因此可以使用PyThreadState_SetAsyncExc强制在违规线程中引发异常.您可以在此处找到使用此API的示例.虽然它是Python代码,但同样的功能可以在您的主应用程序中使用.
这个解决方案不太安全,因为它要求代码不要捕获异常并在之后保持可用状态.
我不打算进入这个,因为它本身就不安全.请参阅有没有办法杀死Python中的线程?对于为什么有些解释.
| 归档时间: |
|
| 查看次数: |
619 次 |
| 最近记录: |