只是为了纯粹,我决定创建一个 方案与libpython结合 因此,您可以将Python嵌入计划程序中。我已经可以打电话给Python的C API,但是我并没有真正考虑过内存管理。

MZScheme的FFI工作方式是我可以调用一个函数,如果该功能返回指针 PyObject, ,然后我可以将其自动增加参考计数。然后,我可以注册一个最终确定器,该最终确定器将在计划对象收集垃圾时减少参考计数。我看了看 参考计数的文档, ,并且乍看之下没有任何问题(尽管在某些情况下可能是最佳的)。我想念有什么垃圾吗?

另外,我很难制作头或尾巴 循环垃圾收集器文档. 。我需要在这里牢记什么?特别是,我如何使Python意识到我对某物有参考,以免在我仍在使用时收集它?

有帮助吗?

解决方案

您的链接 http://docs.python.org/extdending/extgending.html#reference-counts 是正确的地方。文档的扩展和嵌入以及Python/c API部分是解释如何使用C API的内容。

参考计数是使用C API的烦人部分之一。主要的陷阱是保持所有内容的直截了当:根据您所调用的API函数,您可能会或可能不会拥有对所获得对象的引用。要小心了解您是否拥有它(因此不能忘记将其贬低或将其归给它会窃取它的东西)或正在借用它(并且必须在功能期间保留它并可能使用它)。涉及此的最常见的错误是1)错误地记住您是否拥有特定功能返回的参考以及2)相信您可以安全地借用比您更长的参考。

您不必为循环垃圾收集器做任何特别的事情。只是在那里修补参考计数中的缺陷,而不需要直接访问。

其他提示

我认识的最大陷阱是涉及涉及计数,而C API是 __del__ 事物。当您对某事有借来的参考时,您认为您可以在不融合的情况下逃脱,因为在使用该参考文献时不会放弃GIL。但是,如果您最终删除对象(例如,从列表中删除它),则可能触发一个 __del__ 呼叫,这可能会删除您从脚下借用的参考。非常棘手。

如果您(当然,当然)在获得所有参考文献(当然),那么就不会有任何问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top