Limitar la vida útil de un archivo en Python

Hola,

Estoy buscando una manera de limitar la vida útil de un archivo en Python, es decir, crear un archivo que se elimine automáticamente después de 5 minutos después de la creación.


Problema:

Tengo una página web basada en Django que tiene un servicio que genera gráficos (a partir de datos de entrada enviados por el usuario) que se muestran en la página web como imágenes .png. Las imágenes se almacenan en el disco al momento de la creación.

Los archivos de imagen se crean por sesión y solo deben estar disponibles durante un tiempo limitado después de que el usuario los haya visto, y deben eliminarse 5 minutos después de que se hayan creado.


Soluciones posibles:

  1. Miré el archivo temporal de Python, pero eso no es lo que necesito, porque el usuario debería poder regresar a la página que contiene la imagen sin esperar a que se genere nuevamente. En otras palabras, no debe destruirse tan pronto como se cierre.

  2. La otra forma que viene a la mente es llamar a algún tipo de script bash externo que eliminaría los archivos de más de 5 minutos.

¿Alguien sabe una forma preferida de hacer esto?

Las ideas también pueden incluir cambiar la lógica de mostrar/generar los archivos de imagen.

preguntado el 08 de septiembre de 12 a las 09:09

La mejor manera es escribir un script que verifique los archivos y elimine los antiguos. Además, agregarlo a la lista de cronjob garantizará que su script se esté ejecutando. -

Relacionado y podría ser útil stackoverflow.com/questions/3582414/… -

@Alan, también usaría un trabajo cron:

Gracias por las respuestas. ¿Con qué frecuencia llamarías al guión? ¿No se ejecutaría innecesariamente un script periódico cuando no hay usuarios? -

Ok, edité mi respuesta y agregué un código de ejemplo. -

2 Respuestas

Deberías escribir un Comando de administración personalizado de Django para eliminar archivos antiguos que luego puede llamar desde cron.

Si no desea archivos de más de 5 minutos, entonces debe llamarlo cada 5 minutos, por supuesto. Y sí, se ejecutaría innecesariamente cuando no hay usuarios, pero eso no debería preocuparte demasiado.

Respondido el 08 de Septiembre de 12 a las 12:09

Ok, ese podría ser un buen enfoque, supongo ...

Puede escribir un script que verifique su directorio y elimine los archivos obsoletos, y elija el archivo más antiguo de los archivos no eliminados. Calcule cuánto tiempo ha pasado desde que se creó ese archivo y calcule el tiempo restante hasta la eliminación de ese archivo. Luego llame sleep función con el tiempo restante. Cuando sleep termina el tiempo y comienza otro bucle, habrá (al menos) un archivo para eliminar. Si no hay archivos en el directorio, establezca sleep tiempo a 5 minutos.

De esa manera, se asegurará de que cada archivo se elimine exactamente 5 minutos después, pero cuando se crean muchos archivos simultáneamente, el tiempo de inactividad disminuirá considerablemente y su función comenzará a verificar cada archivo con más frecuencia. Para evitar que agregue una latencia adecuada a la función de suspensión antes de iniciar otro ciclo, por ejemplo, si el archivo más antiguo tiene 4 minutos, puede configurar la suspensión en 60+30 segundos (sumando todos los cálculos de tiempo 30 segundos).

Un ejemplo:

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)

Pero como dije, si los archivos se crean con frecuencia, es mejor establecer una latencia para el tiempo de suspensión.

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

Además, es mejor leer obtener tiempo función para más detalles.

Respondido el 08 de Septiembre de 12 a las 14:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.