txt procesamiento modificar importar ficheros ejercicios ejemplos desde crear binarios archivos python unix file-io operating-system ubuntu-12.04

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.