【问题标题】:Limiting the lifetime of a file in Python在 Python 中限制文件的生命周期
【发布时间】:2012-09-08 08:48:55
【问题描述】:

你好,

我正在寻找一种方法来限制 Python 中文件的生命周期,即创建一个将在创建后 5 分钟后自动删除的文件。


问题:

我有一个基于 Django 的网页,该网页具有生成图(从用户提交的输入数据)的服务,这些图在网页上显示为 .png 图像。图像在创建时存储在磁盘上。

图像文件是按会话创建的,并且只能在用户看到它们后的有限时间内可用,并且应该在创建后 5 分钟后删除。


可能的解决方案:

  1. 我查看了 Python 临时文件,但这不是我需要的,因为用户必须能够返回到包含图像的页面,而无需等待它再次生成。换句话说,它不应该一关闭就被销毁

  2. 想到的另一种方法是调用某种外部 bash 脚本,该脚本会删除超过 5 分钟的文件。

有人知道这样做的首选方式吗?

想法还可以包括更改显示/生成图像文件的逻辑。

【问题讨论】:

  • 最好的方法是编写一个检查文件并删除旧文件的脚本。此外,将其添加到 cronjob 列表将保证您的脚本正在运行。
  • 相关且可能有帮助stackoverflow.com/questions/3582414/…
  • @Alan 我也会使用 cron 作业
  • 感谢您的回复。您多久调用一次脚本?没有用户时是否会不必要地运行周期性脚本?
  • 好的,编辑了我的答案并添加了示例代码。

标签: django python-2.7


【解决方案1】:

你应该写一个Django custom management command来删除旧文件,然后你可以从cron调用。

如果您不想要超过 5 分钟的文件,那么您当然需要每 5 分钟调用一次。是的,当没有用户时它会不必要地运行,但这不应该让你太担心。

【讨论】:

    【解决方案2】:

    好吧,我想这可能是一个好方法......

    您可以编写一个脚本来检查您的目录并删除过时的文件,并从未删除的文件中选择最旧的文件。计算自创建该文件以来经过了多少时间,并计算删除该文件的剩余时间。然后用剩余时间调用sleep 函数。当sleep 时间结束并开始另一个循环时,将(至少)有一个文件要删除。如果目录中没有文件,则将sleep 时间设置为5 分钟。

    这样你可以确保每个文件在 5 分钟后被删除,但是当同时创建很多文件时,睡眠时间会大大减少,你的函数会越来越频繁地检查每个文件。为了避免在开始另一个循环之前为睡眠功能添加适当的延迟,例如,如果最旧的文件有 4 分钟的历史,您可以将睡眠设置为 60+30 秒(将所有时间计算添加到 30 秒)。

    一个例子:

    from datetime import datetime
    import time
    import os
    
    def clearDirectory():
        while True:
            _time_list = []
            _now = time.mktime(datetime.now().timetuple())
            for _f in os.listdir('/path/to/your/directory'):
                if os.path.isfile(_f):
                    _f_time = os.path.getmtime(_f) #get file creation/modification time
                    if _now - _f_time < 300:
                        os.remove(_f) # delete outdated file
                    else:
                        _time_list.append(_f_time) # add time info to list
            # after check all files, choose the oldest file creation time from list
            _sleep_time = (_now - min(_time_list)) if _time_list else 300 #if _time_list is empty, set sleep time as 300 seconds, else calculate it based on the oldest file creation time
            time.sleep(_sleep_time)
    

    但正如我所说,如果经常创建文件,最好设置睡眠时间的延迟

    time.sleep(_sleep_time + 30) # sleep 30 seconds more so some other files might be outdated during that time too...
    

    另外,最好阅读getmtime函数了解详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多