使用 python.net 在 C# 中嵌入 python 时的内存管理
Memory Management while embedding python in C# using python.net
我试图了解当使用 python.net 将 python 嵌入到 C# 中时如何管理内存。 Python 在 C# 中使用 py.GIL
(全局解释器锁)执行,本质上 C# 调用 python 解释器并执行 python 代码。我不明白的是如何为 python 个对象分配和释放内存。
我在网上找不到任何内容,我们将不胜感激。
C# PyObject
持有一个 Python 对象句柄(指向 C 堆的指针)。在内部 Python 个对象计算对自身的引用。
在 C# 中,您可以通过调用 PyObject.Dispose
强制释放句柄,在这种情况下 Python 对象引用计数会立即减少,如果此时它达到 0,Python对象将被销毁和释放(从 C 堆)。
或者,等到 PyObject
个实例被 .NET 垃圾收集器收集。当发生这种情况时,Python 对象句柄被添加到一个内部队列中,当您创建新的 PyObject
s 时,该队列会定期清空(例如 PyObject
构造函数将检查该队列,并释放所有把手放在里面)。
这适用于 Python.NET 2.5 和即将发布的 3.0。
我试图了解当使用 python.net 将 python 嵌入到 C# 中时如何管理内存。 Python 在 C# 中使用 py.GIL
(全局解释器锁)执行,本质上 C# 调用 python 解释器并执行 python 代码。我不明白的是如何为 python 个对象分配和释放内存。
我在网上找不到任何内容,我们将不胜感激。
C# PyObject
持有一个 Python 对象句柄(指向 C 堆的指针)。在内部 Python 个对象计算对自身的引用。
在 C# 中,您可以通过调用 PyObject.Dispose
强制释放句柄,在这种情况下 Python 对象引用计数会立即减少,如果此时它达到 0,Python对象将被销毁和释放(从 C 堆)。
或者,等到 PyObject
个实例被 .NET 垃圾收集器收集。当发生这种情况时,Python 对象句柄被添加到一个内部队列中,当您创建新的 PyObject
s 时,该队列会定期清空(例如 PyObject
构造函数将检查该队列,并释放所有把手放在里面)。
这适用于 Python.NET 2.5 和即将发布的 3.0。