在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文档,但没有发现任何与释放内存有关的内容。
我该如何释放这些内存?
应该没问题。垃圾收集可能不会立即发生。在PyPy、Jython等非CPython解释器上,所有集合都是不确定的。在CPython("引用"解释器,相当恰当地说,引用计数(上,当不涉及引用循环时,集合是确定的,但如果形成了引用循环(在奇怪的情况下可能会意外发生,比如在其回溯中包含帧的引发异常(,并且其中一个对象附加到循环中的某个对象,在收集循环本身之前,它不会被清理,这发生在未指定的未来时间(如果使用gc.disable()
禁用循环收集器,或者使用gc.freeze()
冻结未完成的对象,则可能根本不会发生(。
只要";最终清洁";很好,并且您没有干扰循环垃圾收集器,清理最终会发生(底层类型使用终结器来确保内存释放回它来自的共享堆(。