什么时候触发了磁盘写入?

时间:2018-05-28 12:28:53

标签: python python-3.x io cpython disk-io

在Python中,我可以使用f= open(<filename>,<permissions>)打开一个文件。这将返回一个对象f,我可以使用f.write(<some data>)写入该对象。

此时,如果我访问原始的final(例如,来自终端的cat),它显示为空:Python将我写入的数据存储到对象f而不是实际的-disk文件。如果我然后调用f.close()f中的数据将保留在磁盘文件中(我可以从其他程序访问它)。

我假设数据被缓冲以改善延迟。但是,如果缓冲数据增长很多,会发生什么? Python会发起写吗?如果是这样,内部的详细信息(影响缓冲区大小的是什么?是在Python或其他程序/线程中处理的磁盘I / O?Python有可能在写入期间挂起吗?)将非常感激。

1 个答案:

答案 0 :(得分:1)

I / O缓冲的一般主题已被多次处理(包括与评论相关的问题)。但要回答您的具体问题:

  • 默认情况下,当写入终端(“屏幕”)时,换行符会导致文本通过它刷新。对于所有文件,缓冲区每次填充时都会刷新。 (大型单个写入可能会刷新任何现有缓冲区内容,然后绕过它。)
  • 缓冲区具有固定大小,并在写入任何数据之前分配; Python 3不使用stdio,因此它选择自己的缓冲区大小。 (几KB是典型的。)
  • “磁盘I / O”(实际上是内核I / O,仅在网络/电源故障等特殊情况下可区分)在内发生,无论Python写入是否触发刷新。
  • 是的,它可以挂起,如果文件是繁忙进程的管道,慢速网络上的套接字,特殊设备,甚至是从远程计算机挂载的常规文件。