如何释放 multiprocessing.sharedctypes.RawValue 和 multiprocessing.sharedctypes.RawArray?

Posted

技术标签:

【中文标题】如何释放 multiprocessing.sharedctypes.RawValue 和 multiprocessing.sharedctypes.RawArray?【英文标题】:How to free up multiprocessing.sharedctypes.RawValue and multiprocessing.sharedctypes.RawArray? 【发布时间】:2021-03-24 10:59:14 【问题描述】:

在 Python 3.8 中,我有一些共享内存值,如下所示:

from multiprocessing.sharedctypes import RawArray, RawValue

...

sm_best_score_gpu_id = RawValue(ctypes.c_double, -1)
sm_positions = RawArray(ctypes.c_int32, genome_positions)

这需要每隔一段时间重新分配一次。如果我只是循环重复这些操作,会不会在原始变量被垃圾回收时自动释放这些内存?

我浏览了 ctypes 文档,但没有找到任何与释放内存相关的内容。

如何释放这些内存?

【问题讨论】:

【参考方案1】:

应该没问题。垃圾收集可能不会立即发生。在 PyPy、Jython 等非 CPython 解释器上,所有集合都是非确定性的。在 CPython(“引用”解释器,相当恰当地,引用计数)上,当不涉及引用循环时,集合是确定性的,但是如果形成引用循环(这可能会在奇怪的情况下意外发生,例如引发的异常包含帧它们的回溯),并且其中一个对象附加到循环中的某个对象,它不会被清理,直到循环本身被收集,这发生在未指定的未来时间(如果循环收集器是,则可能根本不会发生)用gc.disable() 禁用,或者用gc.freeze() 冻结未完成的对象)。

只要“最终清理”没问题,并且您不干扰循环垃圾收集器,清理最终会发生(底层类型 uses a finalizer to ensure the memory is freed back to the shared heap it came from)。

【讨论】:

来自 C / C++ 世界,我担心会造成内存泄漏。但是,如果它最终被清理干净,那就没关系了。非常感谢!

以上是关于如何释放 multiprocessing.sharedctypes.RawValue 和 multiprocessing.sharedctypes.RawArray?的主要内容,如果未能解决你的问题,请参考以下文章

如何释放/释放 IntPtr 到函数指针?

如何强制释放 UITableViewCell

C#如何释放线程

DELPHI 用TThread如何判断线程是不是存在 并且释放线程

DB2 删除表后如何释放相应磁盘空间

mongodb如何释放磁盘空间