Asegurarme de que mi progtwig no está haciendo una escritura de archivo concurrente

Estoy escribiendo un script que se requiere para realizar escrituras seguras en cualquier archivo dado, es decir, adjuntar un archivo si se sabe que ningún otro proceso está escribiendo en él. Mi comprensión de la teoría era que las escrituras concurrentes se evitaban mediante el uso de lockings de escritura en el sistema de archivos, pero no parece ser el caso en la práctica.

Así es como configuro mi caso de prueba: estoy redirigiendo la salida de un comando ping:

ping 127.0.0.1 > fileForSafeWrites.txt 

En el otro extremo, tengo el siguiente código de Python que intenta escribir en el archivo:

 handle = open('fileForSafeWrites.txt', 'w') handle.write("Probing for opportunity to write") handle.close() 

Ejecutando 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 locking de escritura emitido por el primer proceso que lo protege del código Python.

¿Cómo puedo forzar uno o ambos de mis procesos concurrentes para que no interfieran entre sí? He leído que las personas recomiendan la posibilidad de obtener un identificador de archivo de escritura como evidencia de que el archivo está escrito en modo seguro, como en https://stackoverflow.com/a/3070749/1309045

Es este comportamiento específico de mi sistema operativo y Python. Yo uso Python2.7 en un entorno Ubuntu 12.04.

Inspirado en una solución descrita para verificaciones 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 los 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 verdaderos controles de concurrencia, pero puede combinarse con una variedad de otros métodos con fines prácticos para escribir de forma segura en un archivo sin tener que preocuparse por el texto confuso. Espero que ayude a la siguiente persona en busca de una manera de hacer esto.

EDITAR ACTUALIZACIÓN :

Tras realizar más pruebas, encontré un proceso de escritura de alta frecuencia que requería que la lógica condicional se modificara desde

 if 0 < (modifiedTimeEnd - modifiedTimeStart) < maxWriteFrequency 

a

 if 0 < (modifiedTimeEnd - modifiedTimeStart) <= maxWriteFrequency 

Eso hace una mejor respuesta, en teoría y en la práctica.

Use el módulo de locking de archivos como se muestra en Bloqueo de un archivo en Python