Python,mmap,如果我不手动调用mmap.close()怎么办?

cao*_*nan 1 python mmap

我来自 C++/RAII 世界。

所以我对何时以及如何调用 mmap.close() [而不是 file.close()] 感到困惑。

或者,根本不调用它?会不会有漏水的情况?

至于文档中的示例代码;
如果我想在当前模块外部使用 mmap 缓冲区,
而不是在最后一行就地关闭它怎么办?

    import mmap

    # write a simple example file
    with open("hello.txt", "wb") as f:
        f.write("Hello Python!\n")

    with open("hello.txt", "r+b") as f:
        # memory-map the file, size 0 means whole file
        mm = mmap.mmap(f.fileno(), 0)
        # read content via standard file methods
        print mm.readline()  # prints "Hello Python!"
        # read content via slice notation
        print mm[:5]  # prints "Hello"
        # update content using slice notation;
        # note that new content must have same size
        mm[6:] = " world!\n"
        # ... and read again using standard file methods
        mm.seek(0)
        print mm.readline()  # prints "Hello  world!"
        # close the map
        mm.close()
Run Code Online (Sandbox Code Playgroud)

tde*_*ney 7

查看mmapmodule.c 源代码,当对象引用计数变为零并被删除时,该文件将取消映射并关闭。以下函数位于对象的tp_dealloc. 这与源代码中的方法类似close,这意味着您所要做的就是退出引用映射或del它们的任何变量的范围。

所有这一切都有一个警告。如果有 python 垃圾收集器无法解析的循环引用,则引用计数将永远不会为零,并且资源也不会被清理。注意那些后面的参考资料!

第二个警告 - 我指的是 CPython。谁知道其他实现的核心潜藏着什么。

static void
mmap_object_dealloc(mmap_object *m_obj)
{
#ifdef MS_WINDOWS
    if (m_obj->data != NULL)
        UnmapViewOfFile (m_obj->data);
    if (m_obj->map_handle != NULL)
        CloseHandle (m_obj->map_handle);
    if (m_obj->file_handle != INVALID_HANDLE_VALUE)
        CloseHandle (m_obj->file_handle);
    if (m_obj->tagname)
        PyMem_Free(m_obj->tagname);
#endif /* MS_WINDOWS */

#ifdef UNIX
    if (m_obj->fd >= 0)
        (void) close(m_obj->fd);
    if (m_obj->data!=NULL) {
        munmap(m_obj->data, m_obj->size);
    }
#endif /* UNIX */

    if (m_obj->weakreflist != NULL)
        PyObject_ClearWeakRefs((PyObject *) m_obj);
    Py_TYPE(m_obj)->tp_free((PyObject*)m_obj);
}
Run Code Online (Sandbox Code Playgroud)