1

在 Python 中,我可以使用f= open(<filename>,<permissions>). 这将返回一个对象f,我可以使用f.write(<some data>).

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

我假设数据被缓冲以改善延迟。但是,如果缓冲的数据增长很多,会发生什么?Python会发起写操作吗?如果是这样,内部细节(什么影响缓冲区大小?磁盘 I/O 是在 Python 中处理还是由另一个程序/线程处理?Python 是否有可能在写入期间挂起?)将不胜感激。

4

1 回答 1

1

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

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