我来自 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)
查看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)
| 归档时间: |
|
| 查看次数: |
2046 次 |
| 最近记录: |