modificar - procesamiento de archivos python
Asegurándome de que mi programa no está haciendo una escritura de archivo concurrente (2)
Inspirado en una solución descrita para las comprobaciones de concurrencia , se me ocurrió el siguiente fragmento de código. Funciona si uno es capaz de predecir adecuadamente la frecuencia con la que se escribe el archivo en cuestión. La solución es a través del uso de tiempos de modificación de archivos.
import os
import time
''''''Find if a file was modified in the last x seconds given by writeFrequency.''''''
def isFileBeingWrittenInto(filename,
writeFrequency = 180, overheadTimePercentage = 20):
overhead = 1+float(overheadTimePercentage)/100 # Add some buffer time
maxWriteFrequency = writeFrequency * overhead
modifiedTimeStart = os.stat(filename).st_mtime # Time file last modified
time.sleep(writeFrequency) # wait writeFrequency # of secs
modifiedTimeEnd = os.stat(filename).st_mtime # File modification time again
if 0 < (modifiedTimeEnd - modifiedTimeStart) <= maxWriteFrequency:
return True
else:
return False
if not isFileBeingWrittenInto(''fileForSafeWrites.txt''):
handle = open(''fileForSafeWrites.txt'', ''a'')
handle.write("Text written safely when no one else is writing to the file")
handle.close()
Esto no hace verificaciones de concurrencia verdaderas, pero se puede combinar con una variedad de otros métodos para fines prácticos para escribir de forma segura en un archivo sin tener que preocuparse por el texto ilegible. Espero que ayude a la siguiente persona que busca la forma de hacerlo.
EDITAR ACTUALIZACIÓN :
Tras realizar más pruebas, encontré un proceso de escritura de alta frecuencia que requirió la modificación de la lógica condicional de
if 0 < (modifiedTimeEnd - modifiedTimeStart) < maxWriteFrequency
a
if 0 < (modifiedTimeEnd - modifiedTimeStart) <= maxWriteFrequency
Eso hace una mejor respuesta, en teoría y en la práctica.
Estoy escribiendo una secuencia de comandos que se requiere para realizar escrituras seguras a cualquier archivo dado, es decir, anexar un archivo si no se sabe que otro proceso esté escribiendo en él. Mi comprensión de la teoría era que las escrituras simultáneas se evitaban usando bloqueos de escritura en el sistema de archivos, pero parece que no es el caso en la práctica.
Así es como configuré mi caso de prueba: estoy redirigiendo el resultado de un comando de ping:
ping 127.0.0.1 > fileForSafeWrites.txt
En el otro extremo, tengo el siguiente código python intentando escribir en el archivo:
handle = open(''fileForSafeWrites.txt'', ''w'')
handle.write("Probing for opportunity to write")
handle.close()
Al ejecutar simultáneamente ambos procesos se completan con gracia. Veo que fileForSafeWrites.txt se ha convertido en un archivo con contenido binario, en lugar de un bloqueo de escritura emitido por el primer proceso que lo protege de ser escrito por el código de Python.
¿Cómo fuerzo uno o ambos de mis procesos concurrentes a no interferir entre sí? He leído que las personas recomiendan la posibilidad de obtener un identificador de archivo de escritura como evidencia para que el archivo sea seguro, como en https://stackoverflow.com/a/3070749/1309045
Es este comportamiento específico para mi sistema operativo y Python. Yo uso Python2.7 en un entorno Ubuntu 12.04.
Utilice el módulo de bloqueo de archivos como se muestra en Bloqueo de un archivo en Python