【问题标题】:File seems to be timestamped before it is created文件似乎在创建之前已加盖时间戳
【发布时间】:2021-12-31 06:26:43
【问题描述】:

以下测试总是失败(这在 linux 系统上运行,问题与其他操作系统无关):

    from time import time
    from decimal import Decimal
    from pathlib import Path

    def test_timing():
        start = Decimal(time())
        p = Path(__file__).parent / 'testfile.txt'  # does not yet exist
        p.touch()
        mt = p.stat().st_mtime
        p.unlink()  # unlinked before the failing assert
>       assert start <= mt
E       AssertionError: assert Decimal('1640930671.75709438323974609375') <= 1640930671.7534654

间隔总是大约 3 到 7 毫秒。

Decimal(time()) 在开始时返回的时间戳怎么可能比在它之后两行创建的文件

python 时间戳和 linux 时间戳之间是否存在偏移? python 是否在Decimal(time()) 调用完成之前继续创建文件?我在这里错过了什么?

编辑:我应该提到它是 ext4 文件系统。

【问题讨论】:

  • 文件系统不会以无限精度存储时间戳;原来的 FAT 文件系统有 2 秒 的粒度!显然,您正在使用的时间戳至少有时会四舍五入到下一个可表示的时间戳。
  • 不是这样的。 ext4 将时间戳存储到纳秒。我会发布真正的答案。

标签: python python-3.x linux ext4 filemtime


【解决方案1】:

ext4 文件系统使用current_fs_time 来获取内核时间戳。为了提高效率,内核时间戳是一个缓存值,仅在调度程序间隔更新,大约为 10 毫秒。因此,到存储时间时,时间可能长达 10 毫秒。

附带说明,将时间戳转换为Decimal 是没有意义的。 C 中的值是双精度数,仅包含大约 17 位数字。这意味着您可以精确到微秒。转换为Decimal 不会获得任何额外的精度;其他数字基本上是随机的。

【讨论】:

  • 很高兴知道,除非您知道答案,否则很难调试 ;)
  • 非常感谢!因此,我将删除无用的 Decimal 并简单地添加一个 time.sleep(0.015) 例如,以消除问题。就我而言,速度不是问题。
  • 我很想知道这怎么会成为一个问题。这是一个 picayune 实现细节。如果需要记录文件的创建时间,那么使用p.stat().st_mtime而不是time.time()
猜你喜欢
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 2014-08-05
相关资源
最近更新 更多